2015-11-02 48 views
1

我有一个recyclerview,其中每个列表项有一个带有4个单选按钮的radiogroup。我如何正确存储每个radiogroup的状态。 这是我的代码。在向上/向下滚动状态是不正确的。由于Radiogroup in recyclerview

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

    private List<Element> elements = new ArrayList<>(); 
    private Context context; 

    private int[] state; 

    public ElementListAdapter(Context context, List<Element> elements) { 
     this.context = context; 
     this.elements = elements; 

     this.state = new int[elements.size()]; 
     Arrays.fill(this.state, -1); 
    } 

    @Override 
    public ElementListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_layout, parent, 
       false); 

     return new ViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 
     final Element ele = elements.get(position); 
     final String title = ele.getTitle(); 
     final String description = ele.getDescription(); 

     // Set text 
     holder.tvTitle.setText(title); 
     holder.tvDesciption.setText(description); 

     if (ele.isHeader()) {     
      holder.radioGroup.setVisibility(View.GONE); 
     } else {    
      holder.radioGroup.setVisibility(View.VISIBLE); 
     } 

     setRadio(holder, this.state[position]); 



     holder.rb1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       state[position] = 0; 
       setRadio(holder, state[position]); 
      } 
     }); 
     holder.rb2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       state[position] = 1; 
       setRadio(holder, state[position]); 
      } 
     }); 
     holder.rb3.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       state[position] = 2; 
       setRadio(holder, state[position]); 
      } 
     }); 
     holder.rb4.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       state[position] = 3; 
       setRadio(holder, state[position]); 
      } 
     }); 


    } 

    private void setRadio(final ViewHolder holder, int selection) { 

     System.out.println("SELECT:" + selection); 
     RadioButton b1 = holder.rb1; 
     RadioButton b2 = holder.rb2; 
     RadioButton b3 = holder.rb3; 
     RadioButton b4 = holder.rb4; 

     b1.setChecked(false); 
     b2.setChecked(false); 
     b3.setChecked(false); 
     b4.setChecked(false); 

     if (selection == 0) b1.setChecked(true); 
     if (selection == 1) b2.setChecked(true); 
     if (selection == 2) b3.setChecked(true); 
     if (selection == 3) b4.setChecked(true); 
    } 

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

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     public View view; 
     public TextView tvTitle; 
     public TextView tvDesciption; 

     public RadioGroup radioGroup; 
     public RadioButton rb1, rb2, rb3, rb4; 


     public ViewHolder(View itemView) { 
      super(itemView); 

      view = itemView; 
      tvTitle = (TextView) itemView.findViewById(R.id.title); 
      tvDesciption = (TextView) itemView.findViewById(R.id.description); 

      radioGroup = (RadioGroup) itemView.findViewById(R.id.radioGroup); 
      rb1 = (RadioButton) itemView.findViewById(R.id.rb1); 
      rb2 = (RadioButton) itemView.findViewById(R.id.rb2); 
      rb3 = (RadioButton) itemView.findViewById(R.id.rb3); 
      rb4 = (RadioButton) itemView.findViewById(R.id.rb4); 

     } 
    } 

} 
+0

视图持有人回收,所以你不能默认状态。一种解决方案是动态存储状态(检查适配器位置)并将其恢复到onBindViewHolder中。不要触发任何onCheckChange,虽然 –

回答

8

保存您的作品state最好的办法是将状态变量列表item model内,例如:“元素”在你的情况,比内onBindViewHolder设置状态根据你的模型,你的情况:

改变这一点:setRadio(holder, this.state[position]);

这样:setRadio(holder, elements.get(position).getState());

的onClick方法

前内:对于第一个 改变这样的: state[position] = 0; setRadio(holder, this.state[position]);

这样: elements.get(position).setState(0); setRadio(holder, elements.get(position).getState());

+0

感谢您的回应。它似乎仍然没有工作:/ – sujithvm

+0

我做了建议的更改并删除了setChecked(false),它似乎工作。非常感谢:) – sujithvm

0

这就是我所做的。在我的onBindViewHolder中

if(visualScore[position] == 1){ 
       holder.rg.check(R.id.rb_1); 
      }else{ 
       if(audioScore[position] == 1){ 
        holder.rg.check(R.id.rb_2); 
       }else{ 
        if(kinestScore[position] == 1){ 
         holder.rg.check(R.id.rb_3); 
        }else{ 
         holder.rg.clearCheck(); 
        } 
       } 
      } 
      holder.rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) { 
        switch (checkedId) { 
         case (R.id.rb_1): 
          visualScore[position] = 1; 
          audioScore[position] = 0; 
          kinestScore[position] = 0; 
          break; 
         case (R.id.rb_2): 
          visualScore[position] = 0; 
          audioScore[position] = 1; 
          kinestScore[position] = 0; 
          break; 
         case (R.id.rb_3): 
          visualScore[position] = 0; 
          audioScore[position] = 0; 
          kinestScore[position] = 1; 
          break; 
        } 
     }); 

我将所有得分数组声明为适配器类中的私有全局方法。然后,点击提交按钮时:

int v = 0, a = 0, k = 0; 
        for (int i = 0; i < Questions.length; i++){ 
         v += visualScore[i]; 
         a += audioScore[i]; 
         k += kinestScore[i]; 
        } 
+0

不是说我的方法更好,但它是一种解决方法。当回收者视图被滚动时,onCheckedChanged将被触发,但值仍然保存在数组中 –