我正在制作一个小小的购物清单应用。在应用程序中,如果列表视图中的项目已标记为已购买,则会将其与一条线划掉。我的问题是,当首次显示列表时,如果在列表中有任何标记为已购买的项目,则第一项将显示为标记为已购买(将有一条线通过它),即使它不是。
如果没有项目标记为已购买,则第一项显示为
我的数组适配器的代码
public class ListAdapter extends BaseAdapter{
Context context;
ArrayList<List_Item> items;
public ListAdapter(Context context, ArrayList<List_Item> list){
this.context = context;
items = list;
}
@Override
public int getCount() {
if(items != null)
return items.size();
else
return 0;
}
@Override
public Object getItem(int index) {
return items.get(index);
}
@Override
public long getItemId(int index) {
return 0;
}
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
View view = convertView;
Holder holder = new Holder();
if(convertView == null){
view = LayoutInflater.from(context).inflate(R.layout.complex_list_item, parent, false);
}
holder.main = (TextView)view.findViewById(R.id.LItextView1);
holder.second = (TextView)view.findViewById(R.id.LItextView2);
List_Item item = items.get(pos);
holder.main.setText(item.name);
holder.second.setText(item.qtyToBuy + " " + item.unit + "(s) @ $" + item.price
+ " per " + item.unit.toLowerCase());
if(item.bought){
holder.main.setBackgroundResource(R.drawable.strikeout);
}
return view;
}
class Holder{
TextView main;
TextView second;
}
}
为什么会这样?我怎样才能解决这个问题?任何建议都会非常感激。
答案 0 :(得分:3)
问题是convertView会被重用于列表中的每个项目。
您每次都在创建一个新的holder
,但是您要为其分配从视图中引用的值。
所以会发生的情况是,对于其中一个条目,你调用它并设置背景图像 -
if(item.bought){
holder.main.setBackgroundResource(R.drawable.strikeout);
}
这不仅仅是为当前列表项目条目设置背景图像 - 它正在TextView
设置一个背景图像,该图像将被重复用于每个项目。从那时起,该背景图像在引用的TextView
中设置 - 您需要为每次使用重置它。像 -
if(item.bought){
holder.main.setBackgroundResource(R.drawable.strikeout);
} else {
holder.main.setBackgroundResource(R.drawable.normal);
}
答案 1 :(得分:0)
交叉的项目会再次保存并再次显示?对?然后,您应该使用新数据提供cursor
并致电.notifyDataSetChanged()
,然后再次填充列表(使用新数据)调用.notifyDatasetInvalidated();
我希望它能够正常运行。每次跨项目或显示列表时都会这样做。