我读了另外的帖子,但我找不到适合我的解决方案。我创建了一个自定义 ListView 。此列表中的每个项目都是复杂项目,包含 ImageView 以及两个 TextViews 。应用适配器并填充列表后,我想更改 ImageView 中的图像,但我希望这不会发生在点击事件上。
private class ListAdapter extends ArrayAdapter<RSSItem> {
private List<RSSItem> items;
public ListAdapter(Context context, int textViewResourceId, List<RSSItem> items) {
super(context, textViewResourceId, items);
this.items = items;
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.list_item, null);
}
RSSItem item = items.get(position);
if (item != null) {
ImageView image = (ImageView) v.findViewById(R.id.ivImage);
TextView title = (TextView) v.findViewById(R.id.tvTitle);
TextView description = (TextView) v.findViewById(R.id.tvDescription);
if (image != null) {
Drawable d = getResources().getDrawable(R.drawable.icon);
image.setTag(item.getImageURL());
image.setBackgroundDrawable(d);
}
if (title != null) {
title.setText(item.getTitle());
}
if (description != null) {
description.setText(item.toString());
}
}
return v;
}
}
我试图获取Context,但后来我不知道如何访问正确的 ImageView 。 我感谢任何帮助!
答案 0 :(得分:3)
在RSSItem
类中添加一个字段,告诉适配器要显示哪个图像。在AsyncTask.onPostExecute
方法中更改该值,然后调用notifyDataSetChanged
的{{1}}方法。
您的ArrayAdapter
覆盖应使用您在RSSItem中放置的值来选择要显示的图像。当您拨打getView()
时,会为每个项目再次调用它。
答案 1 :(得分:2)
在ArrayAdapter中延迟加载图片
网上有很棒的教程,展示了如何执行此操作的完整代码示例,还包括缓存,因此您不会多次下载图像。
另外还有一个由谷歌工程师编写的SHELVES安卓应用程序免费开源应用程序,它还提供了多线程,延迟加载和数据缓存图像缓存的示例。我高度建议您仔细阅读此代码。
答案 2 :(得分:1)
如果要从适配器的getView()函数外部更改imageview,可以尝试此操作。
List<View> listOfViews = new ArrayList<View>();
listView1.reclaimViews(listOfViews);
for (View v : listOfViews)
{
ImageView image = (ImageView)v.findViewById(R.id.image);
image.setBackgroundDrawable(drawable);
}