我在android应用程序中使用listview。 我必须从网上下载不同的图像,并将它们添加到每个列表元素下。 图像下载,保存到SD卡以供将来参考和显示正在按预期工作。
但是当我尝试滚动列表时,前几个元素的一些图像被复制或移动到最后一个元素。
这是一种非常奇怪的行为,直到现在我都没有这种行为。
如果有人遇到同样的问题,请帮助我。
提前致谢。
答案 0 :(得分:1)
确保在ListView适配器上实现回收。以下是具有回收功能的Listview适配器示例:
public class NewsAdapter extends ArrayAdapter<NewsDto> {
private final Context context;
ArrayList<NewsDto> nList;
public NewsAdapter(Context context, ArrayList<NewsDto> nList) {
super(context, R.layout.fragment_news_item, nList);
this.context = context;
this nList = nList;
// TODO Auto-generated constructor stub
}
public class ViewHolder {
TextView description;
ImageView image1
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
final ViewHolder holder;
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (view == null) {
view = inflater.inflate(R.layout.fragment_news_item, parent, false);
holder = new ViewHolder();
holder.description = (TextView) view
.findViewById(R.id.news_description);
holder.image1 = (ImageView) view.findViewById(R.id.news_image1);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
// get a single data from your list.
NewsDto newsDto= nlist.get(position);
//initialization of Image
holder.image1.setImageBitmap(newsDto.getImage());
return view;
}
}
滚动时,它使用类来保存列表视图中每个项目的标记。因此,当您向后滚动到已初始化的特定项目时,您的初始化将被回收。
答案 1 :(得分:0)
使用ViewHolder
模式并考虑到Android回收视图,您的适配器getView
看起来像这样(更多伪代码):
public View getView(ViewGroup parent, View convertView, int position) {
ViewHolder holder = null;
if(convertView == null) {
convertView = inflater.inflate(...);
holder = new ViewHolder();
// initialize view holder views from inflated convertView
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
// update each ViewHolder's View with relevant information
return convertView;
}
有关此机制如何运作的详细信息,请查看此热门Google IO presentation(自2010年开始)
答案 2 :(得分:0)
在convertView = null
方法的开头设置getView()
。即。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
convertView = null;
if (convertView == null) {
// your code
}else{
holder = (ViewHolder) convertView.getTag();
}
// your code
}
这将停止回收ListView
元素。当我加载太多项目并滚动ListView
时,它对我有用。