0

私は 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") は、緑色のボタンがスクロール上にあるはずの正しい位置を示します。

リアルビュー:

  • 1 つのボタンをクリックすると、2 つのボタンが緑色に変わります。ボタン num.2 をクリックして下にスクロールすると、ボタン num.12 緑も表示されます。ボタン num.4 の場合は 14 番目、17 番目の場合は 7 番目、というように 10 まで続きます。
  • リストを前後にスクロールすると、他のボタンもランダムに緑色に変わります。

ログは実際のビューと一致しないため、ここで固執しました。私は何を間違っていますか?ListView のクリックされたボタンで別の色をオンにして、リストのスクロール中にそれを保持する方法は?

4

1 に答える 1

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);
}
于 2015-09-08T18:21:11.487 に答える