2016-06-09 119 views
0

Recyclerview有4個項目, textView1,textView2,EditText1和Checkbox1。 Recyclerview也有24行。 EditText在初始階段是不可見的,只有當用戶選中相應的複選框時纔會顯示。 EditText只接受數字。如何在Android中獲取Recyclerview項目的價值?

該應用程序目前工作得很好。

現在我需要獲取所有EditText的值,並且需要在另一個Textview上顯示它,而不是在Recyclerview的部分?

Recyclerview Screenshot- Output Link

代碼示例。

ExamFragment.java

public class ExamFragment extends Fragment { 


    RecyclerView recyclerView; 
    ExamFragmentAdapter adapter; 
    ArrayList<tblChapters> datalistChapters = new ArrayList<>(); 
    TextView txtQcount,txtQCounttotal; 

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View v= inflater.inflate(R.layout.fragment_exam, container, false); 

     txtQCounttotal=(TextView) v.findViewById(R.id.txtQCounttotal); 
     txtQcount=(TextView) v.findViewById(R.id.txtQCount); 
     recyclerView=(RecyclerView)v.findViewById(R.id.recycler_view); 
     conn = new ConnectionClass(); //connection initialisation 
     datalistChapters = conn.getChaptersAndCount(modeid, subjectid); 
     adapter = new ExamFragmentAdapter(datalistChapters, getActivity()); 
     RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); 
     recyclerView.setLayoutManager(mLayoutManager); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerView.setAdapter(adapter); 
     return v; 
} 

} 

ExamFragmentAdapter.java

public class ExamFragmentAdapter extends RecyclerView.Adapter<ExamFragmentAdapter.MyViewHolder> { 

    private LayoutInflater inflater; 
    MyViewHolder holder; 
    Context mContext; 


    ArrayList<tblChapters> chapterList=new ArrayList<>(); 
    public ExamFragmentAdapter(ArrayList<tblChapters> chapterList, Context context) { 
     inflater = LayoutInflater.from(context); 
     this.chapterList = chapterList; 
     mContext=context; 

    } 
    @Override 
    public ExamFragmentAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = inflater.inflate(R.layout.chapter_list_row, parent, false); 
     holder = new MyViewHolder(view, new MyCustomEditTextListener()); 
     return holder; 

    } 

    @Override 
    public void onBindViewHolder(final ExamFragmentAdapter.MyViewHolder holder, final int position) { 
     holder.title.setTextColor(Color.BLACK); 
     holder.slno.setTextColor(Color.BLACK); 
     holder.noOfQst.setTextColor(Color.BLACK); 
     holder.noOfQst.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); 
     holder.noOfQst.setGravity(Gravity.CENTER); 
     holder.title.setText(chapterList.get(position).getTitle()); // Setting Chapter title 
     holder.slno.setText(String.valueOf(position + 1)+"."); //Setting sl no 

     holder._myCustomEditTextListener.updatePosition(position); 

     holder.noOfQst.setText(chapterList.get(position).getNoofQstns()); //Setting no of qstn 

     if (chapterList.get(position).isVisibled()) { 
      holder.noOfQst.setVisibility(View.VISIBLE); 
     } else { 
      holder.noOfQst.setVisibility(View.INVISIBLE); 
     } 

     //in some cases, it will prevent unwanted situations 
     holder.cbox.setOnCheckedChangeListener(null); 

     //if true, your checkbox will be selected, else unselected 
     holder.cbox.setChecked(chapterList.get(position).isSelected()); 

     holder.cbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       //set your object's last status 
       chapterList.get(position).setSelected(isChecked); 
       chapterList.get(position).setVisibled(isChecked); 


       //if checkbox checked display EditText(No of qstns), else hide it. 
       if (holder.cbox.isChecked()) { 
        holder.noOfQst.setVisibility(View.VISIBLE); 
        holder.noOfQst.requestFocus(); 
        holder.noOfQst.setText("10"); 
        chapterList.get(position).setNoofQstns(holder.noOfQst.getText().toString()); 
        /* txtQcount.setText("0"); 
        if (txtQcount.getText().toString().equals("")) { 
         txtQcount.setText("0"); 
        } 
        txtQcount.setText(Integer.valueOf(txtQcount.getText().toString())+Integer.parseInt(holder.noOfQst.getText().toString()));*/ 
       } 
       else { 
        holder.noOfQst.setVisibility(View.INVISIBLE); 
        holder.noOfQst.setText(""); //remove entered value when uncheck 
        chapterList.get(position).setNoofQstns(""); 
       } 
      } 
     }); 

    } 

    // we make TextWatcher to be aware of the position it currently works with 
    // this way, once a new item is attached in onBindViewHolder, it will 
    // update current position MyCustomEditTextListener, reference to which is kept by ViewHolder 
    private class MyCustomEditTextListener implements TextWatcher 

    { 
     private int position; 
     private String oldval; 


     public void updatePosition(int position) { 
      this.position = position; 
     } 

     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { 
      // no op 
     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { 

      chapterList.get(position).setNoofQstns(charSequence.toString()); 
      int j = i; 
      j = i2; 
      j = i3; 
     } 

     @Override 
     public void afterTextChanged(Editable editable) { 


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

    public class MyViewHolder extends RecyclerView.ViewHolder { 
     TextView title; 
     CheckBox cbox; 
     TextView slno; 
     EditText noOfQst; 
     public MyCustomEditTextListener _myCustomEditTextListener; 
     public MyViewHolder(View itemView,MyCustomEditTextListener myCustomEditTextListener) { 
      super(itemView); 

      title = (TextView) itemView.findViewById(R.id.txtTitle); 
      cbox = (CheckBox) itemView.findViewById(R.id.cboxChapter); 
      slno = (TextView) itemView.findViewById(R.id.txtRowSlno); 
      noOfQst = (EditText) itemView.findViewById(R.id.etNoOfQstns); 

      this._myCustomEditTextListener = myCustomEditTextListener; 

      try { 
       if (noOfQst.getVisibility() == View.VISIBLE) { 
        holder.noOfQst.setVisibility(View.INVISIBLE); 
        //adding textchange listener to no of qstn(EditText) 
        noOfQst.addTextChangedListener(myCustomEditTextListener); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 
    } 
+0

實現文本更改偵聽器,並調用與位置和文本的方法。 –

+0

*現在我需要獲得所有EditTexts的價值*爲什麼? ...如果我正確理解你的代碼,你已經有模型類的底層列表中的值...迭代chapterList並收集數據 – Selvin

+0

@selvin .....你是對的。我有ArrayList(chapterList),其中包含適配器類中的所有數據。但是我在片段類中需要這些數據。如何從ExamFragment.java獲取editText值?因爲我需要在另一個不屬於recyclerview或適配器類的textview中顯示此值。 – Sam

回答

0

你可以註冊爲回收視圖適配器的AdapterDataObserver。 適配器更新時(用戶更新EditText)時,適配器中的每個項目都可以調用notifyItemChanged(int position, Object payload)。觀察者將在其onItemRangeChanged (int positionStart, int itemCount, Object payload)回調中收到有效載荷,您可以在有效內容對象中傳遞任何您想要的內容,以累積所有EditText的值。

您也可以註銷觀察員的活動/片段的onStop通過calling unregisterAdapterDataObserver

+0

非常感謝。現在我可以從我的分段頁面輕鬆獲得所有editText的值.. – Sam

+0

不客氣,我很高興幫助。 –

相關問題