私がやろうとしているのは、これです。アプリケーションでインターネットから画像をダウンロードし、アプリケーション専用の場所にある電話の内部メモリに保存する必要があります。リストアイテムに使用できる画像がない場合(つまり、インターネット上で見つからない場合)、デフォルトのプレースホルダー画像を表示したいと思います。これは、list_item_row.xmlファイルでデフォルトとして定義した画像です。
ListActivityファイルで、作成したCustomCursorAdapterクラスのインスタンスを呼び出しています。これはCustomCursorAdapterにあり、すべてのリストアイテムを反復処理し、内部メモリから読み取ろうとすることで、画像ファイルを含め、ビューにマップする必要のあるコンテンツを定義しています。
このテーマについていくつか質問がありますが、例は外部電話メモリ(SDCardなど)に固有のものであるか、画像の代わりに文字列を保存するか、Bitmap.CompressFormatを使用してファイルの解像度を下げる必要があります(これは私の場合、これらの画像はすでに小さい解像度の小さなサムネイルになるためです)。各例のコードをつなぎ合わせるのは難しいので、特定の例について質問します。
現時点では、有効なコードを記述したと思いますが、デフォルトのプレースホルダー画像を含め、リストアイテムの画像が表示されていません。問題の原因が無効なダウンロード/保存コードなのか、無効な読み取りコードなのかはわかりません。内部メモリをチェックしてイメージが存在するかどうかを確認する方法がわからないのは役に立ちません。
とにかく、これが私のコードです。どんな助けでも大歓迎です。
ProductUtils.java
public static String productLookup(String productID, Context c) throws IOException {
URL url = new URL("http://www.samplewebsite.com/" + productID + ".jpg");
URLConnection connection = url.openConnection();
InputStream input = connection.getInputStream();
FileOutputStream output =
c.openFileOutput(productID + "-thumbnail.jpg", Context.MODE_PRIVATE);
byte[] data = new byte[1024];
output.write(data);
output.flush();
output.close();
input.close();
}
CustomCursorAdapter.java
public class CustomCursorAdapter extends CursorAdapter {
public CustomCursorAdapter(Context context, Cursor c) {
super(context, c);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ImageView thumbnail = (ImageView) view.findViewById(R.id.thumbnail);
String fileName =
cursor.getString(cursor.getColumnIndex(DbAdapter.KEY_IMAGE_FILE_PATH));
Bitmap bMap = BitmapFactory.decodeFile(fileName);
thumbnail.setImageBitmap(bMap);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.list_item_row, parent, false);
bindView(v, context, cursor);
return v;
}
}