Search code examples
androidandroid-recyclerviewandroid-cardviewcardview

In recycler view , how do i create new card on every button or icon click in that card


my cardview consists of Some textviews and edittexts such as name,product,code, quantity, total.. etc. I want to create cardview in recycler view such that on every button click (or + icon click) new card shows up. And on click of a final button below all the values of edittexts of all the cards get stored in an array list. I am quite confused how to do that. All the tutorials i see have either parsing or taking values from either database, but i want my cardviews to take values from user and store as well as get created when new button is clicked.


Solution

  • Create layout file my_card_view_item.xml with your CardView and define adapter for your RecyclerView like this:

    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());
                    }
                });
            }
        }
    }
    

    You need to store user entered data and show it in onBindViewHolder method to prevent data lost or data conflict.
    Create instance of the adapter and set it to your RecyclerView. Now on your + button's OnClickListener event, call your adapters addItem method:

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

    Finaly you can get your all cards EditText value and store it in array:

        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
                }
            }
        });