2017-09-20 24 views
0

私は2つのビュータイプを含むRecycleViewを実装しています。 1つのビュータイプにはTextViewが含まれ、その他にはRadioButtonが含まれます。 私は、ラジオボタンのチェック/チェックを外すための配列リストを維持しています。しかし、時々RadioButtonはスクロール時にArray Listを使ってチェックステータスを設定してもチェックを外すことがあります。ここリサイクルビューのAndroidラジオボタンはスクロールのチェックを外します

は私のアダプタクラスがonBindViewに以下

public class AddItemsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

private ArrayList<Object> items=null; 
private final int MENU_OPTION = 0; 
private final int MENU_CHOICE = 1; 
private Context context; 
private int prevSelectedItem=-1; 
private RadioButton prevSelectedRdBtn=null; 


public AddItemsAdapter(Context context, ArrayList<Object> items) { 
    this.items = items; 
    this.context = context; 
} 


@Override 
public int getItemCount() { 
    return this.items.size(); 
} 

@Override 
public int getItemViewType(int position) { 
    if (items.get(position) instanceof MenuOption) { 
     return MENU_OPTION; 
    } else if (items.get(position) instanceof MenuChoice) { 
     return MENU_CHOICE; 
    } 
    else { 
     return -1; 
    } 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    RecyclerView.ViewHolder viewHolder = null; 
    LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); 

    switch (viewType) { 
     case MENU_OPTION: 
      View v1 = inflater.inflate(R.layout.menu_option, viewGroup, false); 
      viewHolder = new VMMenuOptionHolder(v1); 
      break; 
     case MENU_CHOICE: 
      View v2 = inflater.inflate(R.layout.menu_choice, viewGroup, false); 
      viewHolder = new VMMenuChoiceHolder(v2); 
      break; 
     } 
     return viewHolder; 
    } 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int i) { 
    try { 
     switch (viewHolder.getItemViewType()) { 
      case MENU_OPTION: 
       VMMenuOptionHolder vh1 = (VMMenuOptionHolder) viewHolder; 
       MenuOption dt= (MenuOption) items.get(i); 
       vh1.title.setText(dt.getOptionTitle()); 
       vh1.choiceNote.setText(" - Select "+dt.getMaxChoiceAllowed()+" Choices"); 
       break; 
      case MENU_CHOICE: 
       final VMMenuChoiceHolder vh2 = (VMMenuChoiceHolder) viewHolder; 
       MenuChoice mc= (MenuChoice) items.get(i); 
       vh2.radioButton.setChecked(mc.isSelect()); 


       vh2.radioButton.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         if (prevSelectedItem!=i && prevSelectedRdBtn!=vh2.radioButton) { 
          selectChoice(i,vh2); 
         } 
        } 
       }); 
       break; 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private void selectChoice(int pos, VMMenuChoiceHolder vh2) { 
    MenuChoice mc=(MenuChoice) items.get(pos); 
    mc.setSelect(true); 
    vh2.choiceNote.setText(" - Select "+mc.getMaxChoiceAllowed()+" Choices"); 

    if(!mc.getSubMenuChoicesList().isEmpty()){ 
     items.addAll(pos+1,mc.getSubMenuChoicesList()); 
    } 
    if (prevSelectedItem != -1 && prevSelectedRdBtn!= null) { 
     ((MenuChoice) items.get(prevSelectedItem)).setSelect(false); 
     prevSelectedRdBtn.setChecked(false); 
    } 
    notifyDataSetChanged(); 
    prevSelectedItem=pos; 
    prevSelectedRdBtn=vh2.radioButton; 
} 

private class VMMenuChoiceHolder extends RecyclerView.ViewHolder{ 
    TextView choiceNote; 
    RadioButton radioButton; 
    CheckBox checkBox; 

    VMMenuChoiceHolder(final View v2) { 
     super(v2); 
     radioButton=v2.findViewById(R.id.radioButton); 
     checkBox=v2.findViewById(R.id.checkBox); 
     choiceNote=v2.findViewById(R.id.choice_note); 
    } 
} 

}

+0

あなたのコードを質問 –

+0

と共有すると、ラジオボタンの値を保存し、スクロール中にそれらを復元する必要があります。つまり、参照を維持する必要があります –

+0

ラジオボタンの状態をどのように保存しますか? – Piyush

答えて

0

使用ロジックです:

holder.attenCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
      if (holder.attenCheckBox.isChecked()) 
       dataModel.setChecked(true); 
      else 
       dataModel.setChecked(false); 
     } 
    }); 

    if (dataModel.getChecked()) 
     holder.attenCheckBox.setChecked(true); 
    else 
     holder.attenCheckBox.setChecked(false); 
    holder.checkboxLinearLayout.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      if (holder.attenCheckBox.isChecked()) 
       holder.attenCheckBox.setChecked(false); 
      else 
       holder.attenCheckBox.setChecked(true); 


     } 
    }); 

説明:あなたがアップスクロールダウンしたりするとき

リサイクルビューはeveytimeを膨らませます。 チェック状態を追跡するためにデータpojoにフラグを格納する必要があります。 setOnCheckedChangeListenerでそのフラグを使用することで、listenerの後にフラグを設定することを有効/無効にすることができます。

0

ラジオボタンの状態を保存するには、ラジオボタンのonChecked()メソッドのハッシュマップにダイナミックタグを付けて状態を保存します。また、リサイクルビューを膨らませている間に状態を確認してください。詳細説明が必要な場合はコメントしてください。

0

ラジオボタンをチェックすると、チェックした状態を保存する必要があります(arraylistに保存できます)。ビューを作成するたびに(ラジオボタンの状態を確認する必要があります(状態を保存しているarraylistからチェックしてください)。それがチェックされたら、プログラムでラジオボタンをチェックする必要があります。あなたはよく理解してくれるといいですね。

関連する問題