存储单选按钮状态的Arraylist';在androidstudio中使用set方法更新
我有一个带有自定义对象的arraylist,用于存储recyclerview的单选按钮状态。radiobutton状态保存在recyclerview中,每次回收视图时,视图都会携带状态。因此,我决定将单击按钮的状态保存在对象“RadioButtonStates”的arraylist中,该列表存储选中的id、单击的适配器位置以及是否单击了状态。我用伪值“false,0,0”填充arraylist,并在onclick方法中使用set方法更改radiobuttonstate的值。但是set方法不起作用。我觉得问题在于我指的是arraylist的一个实例,而不是arraylist。但是,当我将该方法声明为静态时,这并没有什么区别存储单选按钮状态的Arraylist';在androidstudio中使用set方法更新,android,android-recyclerview,Android,Android Recyclerview,我有一个带有自定义对象的arraylist,用于存储recyclerview的单选按钮状态。radiobutton状态保存在recyclerview中,每次回收视图时,视图都会携带状态。因此,我决定将单击按钮的状态保存在对象“RadioButtonStates”的arraylist中,该列表存储选中的id、单击的适配器位置以及是否单击了状态。我用伪值“false,0,0”填充arraylist,并在onclick方法中使用set方法更改radiobuttonstate的值。但是set方法不起作用
public class WordQuestionAdapter extends RecyclerView.Adapter<WordQuestionAdapter.ViewHolder> {
Context mContext;
Random random = new Random();
ArrayList<WordMaps> wordList = new ArrayList<>();
//arraylist which stores buttonstates
private static ArrayList<RadioButtonStates> buttonStates = new ArrayList<>();
//universalViewHolder object allows to get an instance of the holder from onBindViewholder in order to use available methods.
ViewHolder universalViewHolder;
private RadioGroup radioGroup;
public WordQuestionAdapter(Context context, ArrayList<WordMaps> wordMapsArrayList) {
this.mContext = context;
this.wordList = wordMapsArrayList;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public CardView cardView;
public RadioButton meaning_1, meaning_2, meaning_3, meaning_4;
public RadioGroup radioGroup;
public ViewHolder(CardView view) {
super(view);
cardView = view;
meaning_1 = (RadioButton) cardView.findViewById(R.id.meaning_1);
meaning_2 = (RadioButton) cardView.findViewById(R.id.meaning_2);
meaning_3 = (RadioButton) cardView.findViewById(R.id.meaning_3);
meaning_4 = (RadioButton) cardView.findViewById(R.id.meaning_4);
radioGroup = (RadioGroup) cardView.findViewById(R.id.radio_group);
}
}
@Override
public WordQuestionAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
CardView cV = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, parent, false);
radioGroup = (RadioGroup) cV.findViewById(R.id.radio_group);
//for loop which stores the dummy values in order to deal with NPE's
for(int i = 0; i<5999;i++){
buttonStates.add(i, (new RadioButtonStates(false, 0, 0)));
}
ViewHolder viewHolder = new ViewHolder(cV);
return viewHolder;
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position)
{
Log.i("* Cases", "View binded");
universalViewHolder = holder;
final CardView cardView = holder.cardView;
int true_random_position = random.nextInt(wordList.size());
TextView wordText = (TextView) cardView.findViewById(R.id.word);
switch (random.nextInt(3)) {
case 0:
Log.i("* Cases", "Case 0 called");
wordText.setText(wordList.get(true_random_position).getWord());
holder.meaning_1.setText(wordList.get(true_random_position).getMeaning());
holder.meaning_2.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_3.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_4.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
onRadioButtonClicked(R.id.meaning_1);
holder.meaning_1.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_2.setText(wordList.get(true_random_position).getMeaning());
holder.meaning_3.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_4.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
onRadioButtonClicked(R.id.meaning_2);
//Checks if radioButton is clicked. If boolean of getter and setter returns false,
//then value is not clicked.
if (!buttonStates.get(holder.getAdapterPosition()).getSetChecked()) {
Log.i("* RadioGroup", "radioGroup cleared");
holder.radioGroup.clearCheck();
} else {
Log.i("* RadioGroup", "radioGroup checked "+buttonStates.get(holder.getAdapterPosition()).getCheckedId());
holder.radioGroup.check(buttonStates.get(holder.getAdapterPosition()).getCheckedId());
}
break;
case 1:
Log.i("* Cases", "Case 1 called");
wordText.setText(wordList.get(true_random_position).getWord());
Log.i("position", "" + position);
Log.i("wordText", "" + wordList.get(true_random_position).getWord());
holder.meaning_1.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_2.setText(wordList.get(true_random_position).getMeaning());
holder.meaning_3.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_4.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
onRadioButtonClicked(R.id.meaning_2);
//Checks if radioButton is clicked. If boolean of getter and setter returns false,
//then value is not clicked.
if (!buttonStates.get(holder.getAdapterPosition()).getSetChecked()) {
Log.i("RadioGroup", "radioGroup cleared");
holder.radioGroup.clearCheck();
} else {
Log.i("RadioGroup", "radioGroup checked"+buttonStates.get(holder.getAdapterPosition()).getCheckedId());
holder.radioGroup.check(buttonStates.get(holder.getAdapterPosition()).getCheckedId());
}
break;
case 2:
Log.i("* Cases", "Case 2 called");
wordText.setText(wordList.get(true_random_position).getWord());
holder.meaning_1.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_2.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_3.setText(wordList.get(true_random_position).getMeaning());
holder.meaning_4.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
onRadioButtonClicked(R.id.meaning_3);
holder.meaning_1.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_2.setText(wordList.get(true_random_position).getMeaning());
holder.meaning_3.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_4.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
onRadioButtonClicked(R.id.meaning_2);
//Checks if radioButton is clicked. If boolean of getter and setter returns false,
//then value is not clicked.
if (!buttonStates.get(holder.getAdapterPosition()).getSetChecked()) {
holder.radioGroup.clearCheck();
Log.i("* RadioGroup", "radioGroup checked" + buttonStates.get(holder.getAdapterPosition()).getCheckedId());
} else {
holder.radioGroup.check(buttonStates.get(holder.getAdapterPosition()).getCheckedId());
Log.i("* RadioGroup", "radioGroup checked" + buttonStates.get(holder.getAdapterPosition()).getCheckedId());
}
break;
case 3:
Log.i("* Cases", "Case 3 called");
wordText.setText(wordList.get(true_random_position).getWord());
holder.meaning_1.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_2.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_3.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_4.setText(wordList.get(true_random_position).getMeaning());
onRadioButtonClicked(R.id.meaning_4);
holder.meaning_1.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_2.setText(wordList.get(true_random_position).getMeaning());
holder.meaning_3.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
holder.meaning_4.setText(wordList.get(random.nextInt(wordList.size())).getMeaning());
onRadioButtonClicked(R.id.meaning_2);
//Checks if radioButton is clicked. If boolean of getter and setter returns false,
//then value is not clicked.
if (!buttonStates.get(holder.getAdapterPosition()).getSetChecked()) {
holder.radioGroup.clearCheck();
} else {
//else value is clicked
holder.radioGroup.check(buttonStates.get(holder.getAdapterPosition()).getCheckedId());
}
}
Log.i("* Adapter Position", ""+universalViewHolder.getAdapterPosition());
}
//Radiobutton which checks if the object being clicked is the right one
public void onRadioButtonClicked(final int checkButtonSelect){
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
universalViewHolder.getAdapterPosition();
if(checkedId!=-1) {
Log.i("* checkedButtonId", "" + checkedId);
if (checkedId == checkButtonSelect) {
buttonStates.set(universalViewHolder.getAdapterPosition(), new RadioButtonStates(true, checkedId, universalViewHolder.getAdapterPosition()));
//log statements which check if values were changed. Always returns false"
Log.i("* ButtonState id", "" + buttonStates.get(universalViewHolder.getAdapterPosition()).getCheckedId());
Log.i("* ButtonState position", "" +buttonStates.get(universalViewHolder.getAdapterPosition()).getAdapterPosition());
Toast.makeText(mContext, "CORRECT", Toast.LENGTH_SHORT).show();
} else {
buttonStates.set(universalViewHolder.getAdapterPosition(), new RadioButtonStates(true, checkedId, universalViewHolder.getAdapterPosition()));
//log statements which check if values were changed. Always returns false"
Log.i("* ButtonState boolean", "" + buttonStates.get(universalViewHolder.getAdapterPosition()).getSetChecked());
Log.i("* ButtonState id", "" + buttonStates.get(universalViewHolder.getAdapterPosition()).getCheckedId());
Log.i("* ButtonState position", "" +buttonStates.get(universalViewHolder.getAdapterPosition()).getAdapterPosition());
Toast.makeText(mContext, "INCORRECT", Toast.LENGTH_SHORT).show();
}
}
}
});
}
@Override
public int getItemCount() {
return wordList.size();
}
}
公共类WordQuestionAdapter扩展了RecyclerView.Adapter{
语境;
随机=新随机();
ArrayList wordList=新建ArrayList();
//存储按钮状态的arraylist
private static ArrayList buttonStates=new ArrayList();
//universalViewHolder对象允许从onBindViewholder获取holder的实例,以便使用可用的方法。
视窗夹持器;
私人放射组放射组;
公共WordQuestionAdapter(上下文上下文,ArrayList wordMapsArrayList){
this.mContext=上下文;
this.wordList=wordMapsArrayList;
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
公共卡视图卡视图;
公共单选按钮,表示_1,表示_2,表示_3,表示_4;
公共放射组放射组;
公共视图持有人(CardView视图){
超级(视图);
cardView=视图;
含义_1=(单选按钮)cardView.findViewById(R.id.means_1);
意思是_2=(单选按钮)cardView.findViewById(R.id.means_2);
意思是_3=(单选按钮)cardView.findViewById(R.id.means_3);
意思是_4=(单选按钮)cardwiew.findviewbyd(R.id.means_4);
radioGroup=(radioGroup)cardView.findViewById(R.id.radio\u组);
}
}
@凌驾
public WordQuestionAdapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
CardView cV=(CardView)LayoutFlater.from(parent.getContext())。充气(R.layout.CardView,parent,false);
放射组=(放射组)cV.findViewById(R.id.radio_组);
//存储虚拟值以处理NPE的for循环
对于(int i=0;i问题在于,universalViewHolder
只保存了最后一个holder引用,而没有实时访问holder。因此,当我想更改按钮states
arraylist中的数据时,我遇到了一个大问题,因为它不会更改单击位置的值,而是更改最后一个对h的引用在onBindViewHolder
中较旧。通过将选中的onradiobutton
更改为接受holder
的直接引用(通过接受两个参数调用),我可以直接访问适配器位置