2016-06-09 4 views
0

Recyclerview에는 4 개의 항목이 있습니다. textView1, textView2, EditText1 및 Checkbox1. Recyclerview에도 24 개의 행이 있습니다. EditText는 초기 단계에서 보이지 않습니다. 그러면 해당 확인란이 사용자가 선택한 경우에만 표시됩니다. EditText는 숫자 만 허용합니다.안드로이드에서 Recyclerview 항목의 값을 얻는 방법?

이 앱은 지금까지별로 잘 작동하지 않습니다.

이제는 모든 EditText를 가치있게 가져와 Recyclerview에없는 다른 Textview에 표시해야합니까?

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의 값을 누적 할 수 있습니다.

또한 텍스트 변경 리스너를 구현 calling unregisterAdapterDataObserver

+0

정말 고마워요. 이제 제 조각 페이지에서 모든 editText의 값을 쉽게 얻을 수 있습니다. – Sam

+0

여러분, 반갑습니다. –

관련 문제