Android列表视图项目重复

Android列表视图项目重复,android,listview,baseadapter,Android,Listview,Baseadapter,处理列表视图时,在使用自定义适配器将列表项膨胀到视图后发现问题。 我的问题是随机列表项视图按钮中的文本变为“添加”而不是显示文本“添加”,我添加了适配器代码- view = convertView; if(view==null){ view = mLayoutInflater.inflate(R.layout.list_item, null); mHolder = new ListHolder(); mHolder.mNameTV = (TextView) view.findV

处理列表视图时,在使用自定义适配器将列表项膨胀到视图后发现问题。 我的问题是随机列表项视图按钮中的文本变为“添加”而不是显示文本“添加”,我添加了适配器代码-

view = convertView;
if(view==null){
   view = mLayoutInflater.inflate(R.layout.list_item, null);
   mHolder = new ListHolder();
   mHolder.mNameTV = (TextView) view.findViewById(R.id.user_full_name);
   mHolder.mButton = (Button) view.findViewById(R.id.add);
   view.setTag(mHolder);
}
else{
     mHolder = (ListHolder) view.getTag();
}
mHolder.mNameTV.setText(myList.get(position).getName());
if(myList.get(position).isAdded()){
   mHolder.mButton.setText("Added");
}
 else{
      mHolder.mButton.setText("Add");
 }
return view;
它在文本视图中显示正确的名称,但列表项中按钮的值不正确

提前谢谢

if(myList.get(position).isAdded()){

在这里,请确保在解析数据时尚未设置
true
。正如您使用了上面的
isAdded()
方法一样。看起来,默认情况下,此方法的值返回
true
,因此按钮文本总是以“添加”的形式出现。

这是由于ListView的循环使用,因此您应该存储视图并根据视图更改文本

像这样修改代码

if(view==null){
   view = mLayoutInflater.inflate(R.layout.list_item, null);
   mHolder = new ListHolder();
   mHolder.mNameTV = (TextView) view.findViewById(R.id.user_full_name);
   mHolder.mButton = (Button) view.findViewById(R.id.add);
   view.setTag(mHolder);
   mHolder.mButton.setTag(position);
}
else{
     mHolder = (ListHolder) view.getTag();
}
mHolder.mNameTV.setText(myList.get(position).getName());
int getPosition = (Integer)mHolder.mButton.getTag();
if(myList.get(getPosition).isAdded()){
   mHolder.mButton.setText("Added");
}
 else{
      mHolder.mButton.setText("Add");
 }

在尝试了不同的例子之后,我找到了解决问题的方法。 我为它创建了两个不同的视图,即1.user_added.xml和2。user_add.xml。 在我的适配器内部检查状态,然后像这样充气-

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    if(myList.get(position).isAdded())
        return ADDED;
    else
        return NOTADDED;
}
和内部getView方法-

    int viewType = getItemViewType(position); 
    if(view==null){
        mHolder = new ListHolder();
        if(viewType==NOTADDED){
           view = mLayoutInflater.inflate(R.layout.list_item_not_added, parent,false);
        }
        else{
             view = mLayoutInflater.inflate(R.layout.list_item_added, parent,false);
        }
        mHolder.mNameTV = (TextView) view.findViewById(R.id.user_full_name);
        mHolder.mButton = (Button) view.findViewById(R.id.add);
        view.setTag(mHolder);
     }
     else{
        mHolder = (ListHolder) view.getTag();
     }
      mHolder.mNameTV.setText(myList.get(position).getName());
      mHolder.mButton.setTag(position);
      mHolder.mButton.setOnClickListener(MyListener);

. 您的案例与此类似代码似乎正确。。可能问题出在处理数据的类中?Janey先生,我多次调试代码并检查数据标志值,发现正确,但在运行时它没有显示正确的视图。使用BaseAdapter的重要原因是什么?将标记设置为button
mHolder.mButton.setTag(position)
然后替换此
if(myList.get(position).isAdded())
使用if(myList.get(mHolder.mButton.getTag()).isAdded())Sir,我已将标志isAdded的默认值设置为false,在按钮单击后,标志的值更新为true。当应用程序首次运行所有按钮时,显示值“添加”,然后单击一个按钮,则按钮文本的随机数将更改为“添加”.这就是问题所在。你的代码没有任何意义。既然标签在ViewHolder中,为什么还要向标签添加相同的按钮引用?