2011-07-24 47 views
1

正在制作一个小购物清单应用程序。在应用程序中,如果列表视图中的项目已被标记为已购买,则它会被换行。我的问题是,当列表第一次显示时,如果列表中有任何标记为已购买的物品,则第一个物品将显示为已标记为已购买(即使没有物品)。列表视图中的第一项无法正确显示

image example of problem

如果没有项目被标记为买那么第一项显示为它应该

代码为我的阵列适配器

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

你买过的东西你点击了吗? –

+0

是的,但是当我从文件中显示保存的数据而不是当我点击一个项目时发生这个问题 – user11559

回答

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); 
} 
+0

非常感谢:) – user11559

0

交叉的物品再次保存并再次显示?对?然后你应该给新的数据喂cursor,并且呼叫.notifyDataSetChanged(),并且在列表再次填充(用新数据)呼叫.notifyDatasetInvalidated();我希望它能起作用。每当你交叉项目或显示列表时,你都会这样做。

+0

点击时,我实际上是保存数据并更改单个视图,而不是给适配器提供新数据并重新显示列表。我尝试了你所说的,但问题仍然存在,现在只有当我单击列表项时才会发生。 – user11559

+0

位置不正确?如果是这个位置,那么'position = position - listview.getFirstVisibleItem();' –

相关问题