rakcode
rakcode

Reputation: 2296

recyclerview getting refreshed on adding new item to list

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

Answers (1)

Patrick R
Patrick R

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

Related Questions