Reputation: 2296
I have a recyclerview which holds a cardview, inside cardview i have bunch of radio buttons and 2 time picker and 2 textview.i need to add new cards to recyclerview dynamically on click of button. i implemented a adapte for that and on click of button item is adding to list.
the proble is when i add a card and change time or select radio button, then click on add button again the old card getting refteshed and dta which i have entered is gone, how can i get it
and i have some screenshots how it works
please help me to fix this, thank you
here is my code:
adapter code
@Override
public LabourWorkAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.labour_work_card, parent, false);
return new LabourWorkAdapter.ViewHolder(v);
}
@Override
public void onBindViewHolder(final LabourWorkAdapter.ViewHolder holder, final int position) {
final LabourWorkList listItem = labourWork.get(position);
holder.fromTime.setText(listItem.getFromDate());
holder.toTime.setText(listItem.getToDate());
// holder.cDay.setText(listItem.getFullDay());
holder.fromTimePicker.setOnClickListener(new View.OnClickListener() {
int hour_x = 0;
int minute_x = 0;
@Override
public void onClick(View view) {
TimePickerDialog mTimePicker = new TimePickerDialog(context, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
String hr, mn, timeMode = "AM";
if (selectedHour > 12){
selectedHour = selectedHour-12;
timeMode = "PM";
}
if (selectedHour < 10){
hr = "0"+selectedHour;
}else{
hr = ""+selectedHour;
}
if (selectedMinute < 10){
mn = "0"+selectedMinute;
}else{
mn = ""+selectedMinute;
}
holder.fromTime.setText( hr + ":" + mn + timeMode);
}
}, hour_x, minute_x, false);
mTimePicker.setTitle("Select Time");
mTimePicker.show();
}
});
holder.toTimePicker.setOnClickListener(new View.OnClickListener() {
int hour_x = 0;
int minute_x = 0;
@Override
public void onClick(View view) {
TimePickerDialog mTimePicker = new TimePickerDialog(context, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
String hr, mn, timeMode = "AM";
if (selectedHour > 12){
selectedHour = selectedHour-12;
timeMode = "PM";
}
if (selectedHour < 10){
hr = "0"+selectedHour;
}else{
hr = ""+selectedHour;
}
if (selectedMinute < 10){
mn = "0"+selectedMinute;
}else{
mn = ""+selectedMinute;
}
holder.toTime.setText( hr + ":" + mn + timeMode);
}
}, hour_x, minute_x, false);
mTimePicker.setTitle("Select Time");
mTimePicker.show();
}
});
holder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
labourWork.remove(position);
notifyItemRemoved(position);
notifyDataSetChanged();
notifyItemRangeChanged(position, labourWork.size());
CharSequence text = "Position "+ position;
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
}
});
// holder.labourWorkDay
}
@Override
public int getItemCount() {
return labourWork.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView fromTime, toTime;
Button fromTimePicker, toTimePicker;
ImageView delete;
public ViewHolder(View itemView) {
super(itemView);
fromTime = (TextView) itemView.findViewById(R.id.fromTime);
toTime = (TextView) itemView.findViewById(R.id.toTime);
fromTimePicker = (Button) itemView.findViewById(R.id.fromTimePicker);
toTimePicker = (Button) itemView.findViewById(R.id.toTimePicker);
delete = (ImageView) itemView.findViewById(R.id.deleteLabourCard);
}
}
button click listener
rId.setText(tempLabourId);
recyclerView = (RecyclerView) findViewById(R.id.workDetailsRecycler);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
workList = new ArrayList<>();
addItem = (FloatingActionButton) findViewById(R.id.addLabor);
addItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addToRecyclerView(sPosition);
sPosition++;
}
});
public void addToRecyclerView(int position){
LabourWorkList listItem = new LabourWorkList(position);
recyclerView.findViewHolderForAdapterPosition(position);
workList.add(listItem);
adapter = new LabourWorkAdapter(workList, LabourWork.this);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
Upvotes: 1
Views: 1115
Reputation: 6857
Recyclerview
is getting refreshed every time, because you are setting adapter every time when you add new item and call notifyDataSetChanged
method.
To resolve this, set adapter only once then add new item to list and call
adapter.notifyItemRangeInserted(lastListSize, newListSize);
Upvotes: 1