我想要做的是:让我的应用程序从互联网上下载一张图片并将其保存到手机的内部存储器中,保存位置对应该应用程序。如果列表项中没有可用的图像(例如在互联网上找不到),我希望显示一个默认的占位符图像。这个默认图像是我在list_item_row.xml文件中定义的。
在我的ListActivity文件中,我调用了我编写的CustomCursorAdapter类的一个实例。在CustomCursorAdapter中,我遍历所有列表项,并定义需要映射到视图的内容,包括通过尝试从内部存储器中读取它来读取图像文件。
我看到了几个与此主题相关的问题,但这些示例要么特定于外部手机存储器(例如SD卡),要么涉及保存字符串而不是图像,或涉及使用Bitmap.CompressFormat来减少文件的分辨率(在我的情况下是不必要的,因为这些图像将是已经很小的缩略图)。尝试从每个示例中拼凑代码很困难,因此我询问我的具体示例。
目前,我相信我已经编写了有效的代码,但是我的列表项没有显示任何图像,包括默认的占位符图像。我不知道问题是由无效的下载/保存代码还是无效的读取代码引起的 - 我不知道如何检查内部存储器以查看图像是否存在。
无论如何,这是我的代码。非常感谢您的帮助。
ProductUtils.java
在我的ListActivity文件中,我调用了我编写的CustomCursorAdapter类的一个实例。在CustomCursorAdapter中,我遍历所有列表项,并定义需要映射到视图的内容,包括通过尝试从内部存储器中读取它来读取图像文件。
我看到了几个与此主题相关的问题,但这些示例要么特定于外部手机存储器(例如SD卡),要么涉及保存字符串而不是图像,或涉及使用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;
}
}