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;
}
}
が私を知ってみましょう私の質問に答える。
を参照してください。グライドやピカソなどの画像読み込みライブラリを使ってみましたか?https://github.com/bumptech/glide http://square.github.io/picasso/ – riggaroo
@riggarooこれらのライブラリを調べます。私はアンドロイド開発に比較的新しいです、ここで私の足を濡らそうとしていますが、まだ外部の図書館を調べていません。 – JFKDevelopers
一般的に、独自の画像の読み込みとキャッシングを試みることは悪夢になることがあります。そのようなライブラリが存在するのはこのためです。 – riggaroo