Android ListViewAdapter无法正常运行

时间:2015-09-08 17:59:46

标签: android onclicklistener listview-adapter

我正在努力使用ListViewAdapter并使用OnClickListener。 任务很简单:

  • 列表中的每一行都有蓝色按钮;
  • 按钮应在单击后将颜色更改为绿色;
  • 无论您如何滚动列表,绿色都应保留在点击按钮上。

适配器代码:

 public class ListViewAdapter extends ArrayAdapter<StuffPics> {
 Context context;
 public ArrayList<Integer> mItemsChecked;

 public ListViewAdapter(Context context, int resource, ArrayList<StuffPics> mylist) {
 super(context, resource, mylist);
 this.context = context;
 mItemsChecked = new ArrayList<Integer>();
 }

@Override
public View getView(final int position, View cell, ViewGroup parent) {
final Holder holder;
View v= cell;
if (v == null){
    holder = new Holder();
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = inflater.inflate(R.layout.seepic_test, null);
    holder.mainButton1 = (Button)v.findViewById(R.id.main_button1);
    holder.mainButton2 = (Button)v.findViewById(R.id.main_button2);

    if(mItemsChecked.size()==0 || (!mItemsChecked.contains(position) && position > mItemsChecked.get(mItemsChecked.size() - 1))){
        mItemsChecked.add(position);
        } 
    v.setTag(holder);
}else{

    if(mItemsChecked.size()==0 || (!mItemsChecked.contains(position) && position > mItemsChecked.get(mItemsChecked.size() - 1))){
        mItemsChecked.add(position);
        } 
     holder = (Holder)v.getTag();

    if(!mItemsChecked.contains(position)){
            System.out.println("POSITION GREEN : " + Integer.toString(position));
            holder.mainButton1.setVisibility(View.INVISIBLE);
            holder.mainButton2.setVisibility(View.VISIBLE);
        }
}

holder.mainButton1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
        mItemsChecked.remove(position);
        holder.mainButton1.setVisibility(View.INVISIBLE);
        holder.mainButton2.setVisibility(View.VISIBLE);
    }  
   });
return v;
}

我的想法是收集mItemsChecked数组中的所有位置,然后点击按钮从该数组中删除某个位置,然后重新使用视图根据mItemsChecked数组当前状态分配它 - 如果位置仍在那里,那么蓝色按钮,如果位置不在数组中(单击按钮并移除位置),则为绿色按钮。

现在,根据日志它的工作原理。但不是根据实际观点而来)

日志:

  • 正确收集了mItemsChecked数组;
  • 正确删除某个位置;
  • System.out.println(“POSITION GREEN”)显示正确的位置,其中绿色按钮应滚动。

真实观点:

  • 点击一个按钮,两个按钮变为绿色。如果我单击按钮num.2,然后向下滚动,我将看到按钮num.12绿色。如果按钮编号为4,则为第14 ...如果是第17,则为第7,依此类推至10;
  • 当我向前和向后滚动列表时,其他按钮也会随机变为绿色。

我坚持到这里,因为日志与真实视图不匹配。 我究竟做错了什么 ?如何在ListView中单击的按钮上打开不同的颜色并在列表滚动期间保持它?

1 个答案:

答案 0 :(得分:2)

您的绿色视图正在被回收。在if块

之后放一个else条件
if(!mItemsChecked.contains(position)){
        System.out.println("POSITION GREEN : " + Integer.toString(position));
        holder.mainButton1.setVisibility(View.INVISIBLE);
        holder.mainButton2.setVisibility(View.VISIBLE);
    }
else{
    System.out.println("POSITION Blue : " + Integer.toString(position));
        holder.mainButton1.setVisibility(View.VISIBLE);
        holder.mainButton2.setVisibility(View.INVISIBLE);
}