2017-07-13 5 views
0

my cardviewは名前、製品、コード、数量、合計などのtextviewsやedittextsで構成されています。ボタンをクリック(または+アイコンをクリック)すると、新しいカードが表示されるようなリサイクラビューで表示されます。下の最終ボタンをクリックすると、すべてのカードの編集テキストの値がすべてアレイリストに保存されます。私はそれをどうやってするのか非常に混乱しています。私が見るすべてのチュートリアルでは、いずれかのデータベースから解析または値を取っているが、新しいボタンをクリックしたときに作成されるだけでなく、ユーザーおよびストアから値を取得するように私のcardviewをしたい。リサイクラービューでは、ボタンやアイコンをクリックするたびに新しいカードを作成するにはどうすればいいですか?

答えて

0

あなたのCardViewでレイアウトファイルmy_card_view_item.xmlを作成し、このようなあなたのRecyclerView用のアダプタを定義します。

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

    List<String> myList; 

    public MyAdapter(List<String> myList) { 
     this.myList = myList; 
    } 

    public void addItem() { 
     myList.add(new String()); 
     notifyItemInserted(myList.size() - 1); 
    } 

    @Override 
    public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_card_view_item, parent, false); 
     return new MyViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) { 
     // bind your view 

     holder.editText.setText(myList.get(position)); 
    } 

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


    public class MyViewHolder extends RecyclerView.ViewHolder { 

     EditText editText; 
     Button btn_remove; 

     public MyViewHolder(View itemView) { 
      super(itemView); 
      editText = (EditText) itemView.findViewById(R.id.editText); 
      btn_remove = (Button) itemView.findViewById(R.id.btn_remove); 

      editText.addTextChangedListener(new TextWatcher() { 
       @Override 
       public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

       } 

       @Override 
       public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
        myList.set(getAdapterPosition(), charSequence.toString()); 
       } 

       @Override 
       public void afterTextChanged(Editable editable) { 

       } 
      }); 


      btn_remove.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        myList.remove(getAdapterPosition()); 
        notifyItemRemoved(getAdapterPosition()); 
        notifyItemRangeChanged(getAdapterPosition(), myList.size()); 
       } 
      }); 
     } 
    } 
} 

あなたはユーザが入力したデータを保存し、失われたデータやデータの衝突を防ぐためにonBindViewHolder方法でそれを表示する必要があります。
アダプタのインスタンスを作成し、RecyclerViewに設定します。 今すぐあなたの+ボタンのOnClickListenerイベントで、addItem方法あなたのアダプタを呼び出す:あなたはすべてのカードのEditTextの値を取得し、配列に格納することができます

btn_add.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      adapter.addItem(); 
     } 
    }); 

Finaly:

良い
btn_final.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      for (int i = 0; i < adapter.getItemCount(); i++) { 
       EditText et = (EditText) recyclerView.getLayoutManager().findViewByPosition(i).findViewById(R.id.edit_text); 
       // Store et.getText() in your array 
      } 
     } 
    }); 
+0

、それ工assは何ですか?なぜあなたはそれのための配列リストを作成したのですか? – Robin10

+0

getItemcount()の実行後にNULLポインタ例外が表示される – Robin10

+0

ビューにデータをバインドする必要がない場合は、リストを削除し、ItemCountとしてint型変数のみを使用してaddItemを増やすことができます。 – SiSa

関連する問題