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