2017-01-03 4 views
1

AndroidスタジオでAndroidアプリケーションを作成中です。私は途中でちょっとした悩みに遭遇しました。私はアイテムを追加したり削除したりできるかなり標準的なListViewを使用しています。そのビットは完全に動作しています。ユーザーの電話にデータを保存するために(自分のサーバーがまだないため)、ユーザーの電話にデータを保存することを選択しました。SQLiteデータベースから取得したURLから画像をダウンロードする問題

アプリケーション用のデータを保存するために、次のチュートリアルを使用していくつかの列名を変更し、必要に応じて列を追加してSQLiteデータベースを作成しましたhttp://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/

作成した列の1つに、ムービーポスター画像のURLが含まれています。私のオブジェクトクラスはこのイメージをダウンロードし、Drawableとして設定します。このビットも完全に動作しています。私は正常にデータベースにURLを格納することができ、アプリケーションがリロードされたときに正しく引き出します。しかし、アプリケーションをリロードすると、ListViewの以前のアイテムは、正しいURLがObjectクラスに渡されていてもイメージをダウンロードしません。私が間違っている場所を見てみましょう。あらかじめありがとう! MainActivityから(私はSQLiteデータベースをCRUD)

データベースヘルパー

public class DatabaseHandler extends SQLiteOpenHelper{ 
//database version 
private static final int DATABASE_VERSION = 1; 
//database name 
private static final String DATABASE_NAME = "moviesManager"; 
//table name 
private static final String TABLE_MOVIES = "movies"; 
//table column names 
private static final String KEY_ID = "idSTRING"; 
private static final String KEY_TITLE = "Title"; 
private static final String KEY_YEAR = "Year"; 
private static final String KEY_RATING = "Rating"; 
private static final String KEY_POSTER = "URL"; 

public DatabaseHandler(Context context){ 
    super(context,DATABASE_NAME,null,DATABASE_VERSION); 
} 

//creating tables 
@Override 
public void onCreate(SQLiteDatabase db) { 
    String CREATE_MOVIES_TABLE = "CREATE TABLE " + TABLE_MOVIES + "(" 
      + KEY_ID + "STRING PRIMARY KEY," + KEY_TITLE + " TEXT," 
      + KEY_YEAR + " TEXT," + KEY_RATING + " TEXT," 
      + KEY_POSTER + " TEXT" + ")"; 
    db.execSQL(CREATE_MOVIES_TABLE); 
} 

//upgrading database 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    //drop older table if existed 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_MOVIES); 
    //create table again 
    onCreate(db); 
} 

//CRUD (Create, Read, Update, Delete) Operations 
//add new movie 
void addMovie(Movie movie){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(KEY_ID, movie.getId()); 
    values.put(KEY_TITLE, movie.getTitle()); 
    values.put(KEY_YEAR, movie.getYear()); 
    values.put(KEY_RATING, movie.getRating()); 
    values.put(KEY_POSTER, movie.getImgUrl()); 
    //Log.e("poster:", values.get(KEY_POSTER).toString()); 

    //Inserting row 
    db.insert(TABLE_MOVIES, movie.getId(), values); 
    //Log.e("Poster in DB: ",getMovie(movie.getId()).getImgUrl()); 
    db.close(); //closing database connection 
} 

public List<Movie> getAllMovies(){ 
    List<Movie> movieList = new ArrayList<>(); 
    String selectQuery = "SELECT * FROM " + TABLE_MOVIES; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 
    //looping through all rows and adding to list 
    if(cursor.moveToFirst()) { 
     do{ 
      Movie movie = new Movie(); 
      movie.setId(cursor.getString(0)); 
      movie.setTitle(cursor.getString(1)); 
      movie.setYear(cursor.getString(2)); 
      movie.setRating(cursor.getString(3)); 
      movie.setPoster(cursor.getString(4)); 
      movieList.add(movie); 
     }while(cursor.moveToNext()); 
    } 
    //cursor.close(); 
    return movieList; 
} 
    ... 
} 

:Movieクラスから

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    ... 

    lv = (ListView) findViewById(R.id.list); 
    movies = db.getAllMovies(); 
    mAdapter = new MovieAdapter(this, movies); 
    lv.setAdapter(mAdapter); 

    ... 
} 

:より多くの情報が必要な場合

... 
public void setPoster(String imgUrl) { 
    this.imgUrl = imgUrl; 
    this.poster = LoadImageFromWebOperations(this.imgUrl); 
} 

private static Drawable LoadImageFromWebOperations(String url) { 
    try { 
     InputStream is = (InputStream) new URL(url).getContent(); 
     return Drawable.createFromStream(is, "src name"); 
    } catch (Exception e) { 
     Log.e("err","poster not found at "+url); 
     return null; 
    } 
} 

が私を知ってみましょう私の質問に答える。

+0

を参照してください。グライドやピカソなどの画像読み込みライブラリを使ってみましたか?https://github.com/bumptech/glide http://square.github.io/picasso/ – riggaroo

+0

@riggarooこれらのライブラリを調べます。私はアンドロイド開発に比較的新しいです、ここで私の足を濡らそうとしていますが、まだ外部の図書館を調べていません。 – JFKDevelopers

+0

一般的に、独自の画像の読み込みとキャッシングを試みることは悪夢になることがあります。そのようなライブラリが存在するのはこのためです。 – riggaroo

答えて

1

riggarooは、これらの種類のタスクにライブラリを使用することは、画像を非同期的に読み込んでメモリを管理するので非常に有用であると示唆しています。

私は個人的にこの種の仕事にピカソを使うことを勧めます。

あなたはちょうどpicassoのlibをインポートし、このコード行を追加してイメージを読み込む必要があります。ライブラリとより多くの使用をインポートするための

Picasso.with(this).load("YOUR IMAGE URL HERE")into(imageView); 

これは関連していない可能性がありますが、あなたの将来の問題の一部を解決することがありhere Picaso Guide

+1

もう一つの素晴らしい選択肢は、** [Glide](https://github.com/bumptech/glide)です** library – Meet

+0

応答に感謝します。私は自分のニーズに合うようにピカソの図書館を使うことを検討しています。私が作成したクラスでこのコードを使用する方法はありますか? "静的コンテキストから参照できない"ため、コンテキスト部分に問題が発生しています。何か案は? – JFKDevelopers

+0

コンストラクタで作成したクラスまたはメソッドのパラメータに 'Context'アクティビティを渡すことができます。 – Jayanth

関連する問題