Android 列表视图中的第一项显示不正确
我正在制作一个小购物清单应用程序。在应用程序中,如果列表视图中的某个项目被标记为已购买,则会用一行划掉。我的问题是,当列表第一次显示时,如果列表中有任何项目标记为已购买,则第一个项目将显示为已标记为已购买(将有一行通过它),即使它不是 如果没有任何项目标记为已购买,则第一个项目将按其应显示 我的阵列适配器的代码Android 列表视图中的第一项显示不正确,android,listview,Android,Listview,我正在制作一个小购物清单应用程序。在应用程序中,如果列表视图中的某个项目被标记为已购买,则会用一行划掉。我的问题是,当列表第一次显示时,如果列表中有任何项目标记为已购买,则第一个项目将显示为已标记为已购买(将有一行通过它),即使它不是 如果没有任何项目标记为已购买,则第一个项目将按其应显示 我的阵列适配器的代码 public class ListAdapter extends BaseAdapter{ Context context; ArrayList<List_Item> it
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;
}
}
公共类ListAdapter扩展了BaseAdapter{
语境;
数组列表项;
公共ListAdapter(上下文上下文,ArrayList列表){
this.context=上下文;
项目=列表;
}
@凌驾
public int getCount(){
如果(项!=null)
返回items.size();
其他的
返回0;
}
@凌驾
公共对象getItem(int索引){
返回项目。获取(索引);
}
@凌驾
公共长getItemId(int索引){
返回0;
}
@凌驾
公共视图getView(int pos、视图转换视图、视图组父视图){
视图=转换视图;
支架=新支架();
if(convertView==null){
视图=LayoutFlater.from(上下文)。充气(R.layout.complex\u list\u项,父项,false);
}
holder.main=(TextView)view.findViewById(R.id.LItextView1);
holder.second=(TextView)view.findViewById(R.id.LItextView2);
列表\项目=项目。获取(pos);
holder.main.setText(项目名称);
holder.second.setText(item.qtyToBuy+“”+item.unit+“(s)@$”+item.price
+“per”+item.unit.toLowerCase());
如果(购买的物品){
持有人。主要。挫折资源(右拉深。三振);
}
返回视图;
}
阶级持有者{
文本视图主视图;
文本视图第二;
}
}
为什么会这样?我怎样才能解决这个问题?如果您有任何建议,我们将不胜感激。是否再次保存并显示交叉项目?对吗?然后,您应该向
光标
输入新数据并调用.notifyDataSetChanged()
,然后在再次填充列表(使用新数据)后调用.notifyDataSetValidated()我希望它能起作用。每次交叉项目或显示列表时都会执行此操作 问题是列表中的每个项目都会重用convertView。
每次都要创建一个新的保持架
,但要为其指定从视图中引用的值
因此,对于其中一个条目,您调用它并设置背景图像-
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);
}
您购买的项目使用“单击”将它们交叉?是的,但当我显示文件中保存的数据时,而不是当我单击项目时,会发生此问题。单击时,我实际上是在保存数据并更改单个视图,而不是给适配器新数据并重新显示列表。我尝试了你所说的,但问题仍然存在,直到现在,当我单击列表项时也会发生。位置不正确?如果是位置,则执行此position=position-listview.getFirstVisibleItem()代码>