设置我有一个RecyclerView
与一个自定义适配器和自定义ViewHolder
s。ViewHolder布局更新不适用onBindViewHolder()
我知道onCreateViewHolder()
方法在RecyclerView
用完ViewHolders以回收并需要一个新方法时调用。所以,我只是一个充气布局在那里,它传递到一个新的ViewHolder.
此外,onBindViewHolder()
负责为新ViewHolder
已创建或由RecyclerView
回收尽快填补ViewHolder
数据。所以我在那里做的是调用我的方法holder.setNode()
将数据对象传递给ViewHolder
。
我看到的行为活动第一次启动时,所有条目都是正确的。但是,当我添加新条目或删除现有条目时,情况开始变得有点滑稽。
- 的
title
TextView
始终设置正确 - 看似随意的主要布局的背景颜色,我假设,因为
RecyclerView
被重复使用旧的 - 一样我已经实现了自定义视图,即使我无效,并传递哪些改变它的外观新的价值明显
所以我想知道:为什么不尽快观点得到重用在onBindViewHolder()
改变这些值?或者如果我错了,布局随机切换的真正原因是什么?
TaskListAdapter
class TaskListAdapter extends RecyclerView.Adapter<TaskListAdapter.TaskViewHolder> {
private ArrayList<NodeHandler.DbNode> dbNodeList = new ArrayList<>();
...
@Override
public TaskViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.small_task_view, parent, false);
return new TaskViewHolder(v);
}
@Override
public void onBindViewHolder(TaskViewHolder holder, int position) {
final NodeHandler.DbNode dbNode = dbNodeList.get(position);
holder.setNode(dbNode);
holder.wrapper.findViewById(R.id.card_details).setVisibility(View.GONE);
}
...
public static class TaskViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder {
private FrameLayout wrapper;
private TextView title;
private NodeHandler.DbNode dbNode;
public TaskViewHolder(View view) {
...
}
public void setTitle(String str) {
title.setText(str);
}
public void setMarkers(@IntRange(from = 1, to = Node.MAX_URGENCY) int urgency, @IntRange(from = 1, to = Node.MAX_IMPORTANCE) int importance) {
if(!dbNode.isAppointment()) {
wrapper.setBackgroundColor(ContextCompat.getColor(wrapper.getContext(), R.color.lightGray));
}
((QuadrantView) wrapper.findViewById(R.id.quadrant_view)).setDimensions(importance, urgency);
// setDimensions will invalidate the view
}
public void setNode(NodeHandler.DbNode dbNodeObject) {
this.dbNode = dbNodeObject;
setTitle(dbNode.toString());
setMarkers(dbNode.getUrgency(), dbNode.getImportance());
setTips();
}
}
}
让我知道你什么都可以在这里无关紧要。我很乐意相应地更新问题。
嘿,我愣住了。完全忽略了这一点。我刚刚做到这一点,以便自定义视图被替换为全新的自定义视图,但它显然是可怕的。我会问一个不同的问题。谢谢! – Yorrd
不客气! :) – Eric