我有一个用于Listview的自定义布局,每个行项目都包含一个按钮,当单击该按钮时,该按钮会在该项目中显示一个小的imageview,但是我在一个项目中执行的操作会重复执行列表中的另一个项目,例如,如果我单击项目1中的按钮,则imageview将显示在项目1和项目10中,如果我单击项目2中的按钮,则Imageview将显示在项目2和项目11中,并且当我滚动时,它会在其中重复不同的项目,以下是我的自定义适配器的代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
mparent = parent;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.places_item, parent, false);
holder = new ViewHolder();
holder.placeimage = (CircularImageView) convertView.findViewById(R.id.locationimage_pilayout);
holder.addbtn = (TextView) convertView.findViewById(R.id.addbtn_pilayout);
holder.delbtn = (TextView) convertView.findViewById(R.id.delbtn_pilayout);
holder.oribtn = (TextView) convertView.findViewById(R.id.oribtn_pilayout);
holder.placename = (TextView) convertView.findViewById(R.id.locationname_pilayout);
holder.selected = (ImageView) convertView.findViewById(R.id.selected_pilayout);
holder.origin = (ImageView) convertView.findViewById(R.id.origin_pilayout);
holder.swipeLayout = (SwipeRevealLayout) convertView.findViewById(R.id.swipe_pilayout);
holder.mainLayout = (LinearLayout) convertView.findViewById(R.id.main_pilayout);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final Place item = getItem(position);
/*
my code assigning the button click listener and assigning the views
*/
return convertView;
}
我想念什么吗?我肯定这可能是一个简单的修复,但我还没有找到它。任何帮助将不胜感激。
答案 0 :(得分:1)
在ListView
的行的各个视图中,可以重复使用。例如,假设该窗口在ListView
内最多可以显示10行。现在,当您向下滚动时,第一个视图从顶部移出窗口,而新的第11个视图从底部移入窗口。为了节省内存和CPU能力,Android将相同的1st视图用于11th视图。这就是convertView
和if (convertView == null) {} else {}
代码的目的。
因此在第一项和第11项中显示图像的原因是它们恰好是一个视图对象。要解决此问题,请使用getView()
方法,重置每个视图的每个属性,并且不要依赖默认值。
因此,添加类似于以下内容的一行将消除上述问题:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// all your code ...
holder.placeImage.setImageResource(0); //<-- This clears any previously set image.
return convertView;
}