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()