2017-11-18 12 views
0

私はリストビューの行をリサイクルすることについて知っています。私はトグルボタン付きのリストビューを持っています。多くの投稿が示唆するように、SparseBooleanArrayにトグルボタンの状態を保存しています。私の問題は、トグルボタンの行は、とにかくスクロールでオンとオフになることです。私のコードでは、トグルボタンの状態と配列内のそれぞれの位置を保存しています。それらの状態は同じ配列から取得します。おかげさまで あなたが投稿したコードからリストビューのトグルボタンの状態を保存する

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     final ViewHolderBrandAvailability holder; 
     if(row == null){ 
      dbHelper = new DBHelper(con); 
      database = dbHelper.getWritableDatabase(); 
      LayoutInflater mInflater = (LayoutInflater) con.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      //viewHolderBrandAvailability = new ViewHolderBrandAvailability(); 
      row = mInflater.inflate(R.layout.brand_availability_listview, parent, false); 
      holder = new ViewHolderBrandAvailability(); 
      holder.brandNameTextView = (TextView) row.findViewById(R.id.brandAvailabilityNameText); 
      holder.radioGroup = (ToggleButton) row.findViewById(R.id.brandAvailable); 
      /*viewHolderBrandAvailability.unavailableRadioBtn = (RadioButton) convertView.findViewById(R.id.brandUnavailable);*/ 

      row.setTag(holder); 
     }else { 
      holder = (ViewHolderBrandAvailability) row.getTag(); 
     } 

     holder.radioGroup.setTag(position); 
     holder.radioGroup.setChecked(mCheckStates.get(position, false)); 

     holder.radioGroup.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
       if(isChecked){ 

        selectedBrandStatus.put(((BrandAvailability)list.get(position)).getBrand_id(), "Yes"); 

       }else { 
        selectedBrandStatus.put(((BrandAvailability)list.get(position)).getBrand_id(), "No"); 

       } 
       mCheckStates.put((Integer) compoundButton.getTag(), isChecked); 
      } 
     }); 


     String brandTitle = ((BrandAvailability)list.get(position)).getBrand_title(); 
     holder.brandNameTextView.setText(brandTitle); 
     //holder.radioGroup.setChecked(); 
     return row; 
    } 

    static class ViewHolderBrandAvailability { 
     private TextView brandNameTextView; 
     private ToggleButton radioGroup; 
     //RadioButton unavailableRadioBtn; 
     //int position; 
    } 
+0

'ToggleButton'が間違ってチェックされた状態にあるか、' selectedBrandStatus'が "いいえ"と言わなければならないという問題(またはその逆)ですか? –

+0

トグルボタンの状態が正しくありません。 –

答えて

0

、私はスクロールのToggleButton変更のチェック状態に問題があることを示して何も見えません。実際には、自分のコードをテストするために自分のアダプタを作成しました。彼らはgetView()に1回の呼び出しで設定されOnCheckedChangeListenergetView()に次の呼び出し中に固執し、そのsetChecked()コールがそれをトリガー巻き取ることに気付いていないので、

は多くの場合、人々は、同様の問題が発生しました。しかし、あなたのケースでは、mCheckStates配列へのインデックスを決定するためにcompoundButton.getTag()を使用しているので、ここに問題はありません。言われていること

、あなたあるリスナーで他の操作のためのgetView()position引数を使用して、この私は、上記の問題が発生します。

selectedBrandStatus.put(((BrandAvailability)list.get(position)).getBrand_id(), "Yes"); 

想像getView()はあなたのコードが実行され、リスナーを割り当て位置は0のため、非常に初めて呼び出されます。 ToggleButtonの位置が0であることを確認すると、selectedBrandStatus.put(list.get(0).getBrand_id(), "Yes")と呼ばれます。このビューがリサイクルされるまで、リストをスクロールします。getView()が再度呼び出され、このビューはconvertViewとして渡されます。あなたの聴取者はまだ存在しているので、ToggleButtonholder.radioGroup.setChecked(mCheckStates.get(20, false))でチェックされていない場合、それは再びトリガーされます。今では、リスナーが= 0

positionを使用して作成されたので、あなただけ(Integer) compoundButton.getTag()すると、それがこの問題を修正するリスナー内のすべてのインデックスを変更することができ、"No"で以前"Yes"が上書きされます。

関連する問題