我有一个ListView,列表中的每个项目都包含多个图像。
当我创建列表时,我想异步下载图像,以便列表可以快速显示,图像可以在下载时填写。
我扩展了AsyncTask
类并实现了一个简单的下载方法。但是,我不确定如何将图像更新回到列表视图中的正确位置:
@Override
protected void onPostExecute(Bitmap result) {
// TODO show the downloaded image to the list
super.onPostExecute(result);
}
这是我的班级定义:
public class ImageDownloadWorker extends AsyncTask<String, Void, Bitmap>
我的doInBackground
方法:
@Override
protected Bitmap doInBackground(String... params) {
try {
return downloadBitmap(params[0]);
} catch (ClientProtocolException e) {
return null;
} catch (Exception e) {
return null;
}
}
我们应该使用什么常用模式将下载的图像映射到列表中正确列表项的正确ImageView?谢谢!
答案 0 :(得分:1)
您需要实现适配器模式来填充列表视图。在您的情况下,您可以创建自定义适配器类并扩展BaseAdapter并实现其所有方法。模式就是这样。
<强> MainActivity.java 强>
public class MainActivity extends Activity {
private ListView listView;
private CustomAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = findViewById(android.R.id.list);
}
private class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... strings) {
try {
return downloadBitmap(params[0]);
} catch (ClientProtocolException e) {
return null;
} catch (Exception e) {
return null;
}
}
@Override
protected void onPostExecute(Bitmap bitmap) {
adapter = new CustomAdapter(bitmap);
listView.setAdapter(adapter);
super.onPostExecute(bitmap);
}
}
private class CustomAdapter extends BaseAdapter {
private Bitmap bitmap;
private LayoutInflater inflater = null;
class ViewHolder {
ImageView image;
}
public CustomAdapter(Bitmap bitmap) {
this.bitmap = bitmap;
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return 0;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View convertView, ViewGroup parent) {
final ViewHolder holder;
if(convertView == null) {
convertView = inflater.inflate(R.layout.list_item, parent, false);
holder.image = convertView.findViewById(R.id.imageView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.image.setImageBitmap();
return convertView;
}
}
}
main.xml中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
list_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
但是,当您将许多图像加载到列表视图中时,创建一个ArrayList并将其发送到listAdapter
答案 1 :(得分:0)
我需要在很多项目中对你做同样的事情,这个库非常有用且非常简单易用: