2017-06-24 162 views
0

我有一个recyclerview其中持有cardview,cardview内我有一堆单选按钮和2时间选择器和2 textview.i需要添加新卡动态回收站点击按钮。我实现了一个适配器,并点击按钮项目添加到列表中。recyclerview刷新添加新项目列表

的proble是,当我加入卡并更改时间或选择单选按钮,然后单击添加按钮再次旧卡越来越refteshed和DTA我已经进入走了,我怎么能得到它

和我有一些截图它是如何工作

请帮我解决这个问题,谢谢

这里是我的代码:

适配器代码

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

按钮点击收听

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

请显示[MCVE。特别是,你的代码有一个编译器错误,因为没有类。也请修正格式。 –

+0

你也可以看看适配器的各种方法,而不是仅仅使用'notifyDataSetChanged()'来满足你的需求。 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html – Raghunandan

回答

1

Recyclerview是越来越刷新每一次,因为你每次设置适配器当您添加新项目,并调用notifyDataSetChanged方法。

要解决此问题,设置适配器仅一次,然后添加新项列表和电话

adapter.notifyItemRangeInserted(lastListSize, newListSize);