设置我有一个带有自定义适配器和自定义ViewHolders的RecyclerView.
我知道当RecyclerView用完ViewHolders以回收并需要一个新的时,就会调用onCreateViewHolder()方法.所以我只是在那里夸大布局并将其传递给新的ViewHolder.
此外,只要RecyclerView创建或回收了新的ViewHolder,onBindViewHolder()就会负责为ViewHolder填充数据.所以我在那里做的是调用我的方法holder.setNode()将数据对象传递给ViewHolder.
我看到的行为当活动首次启动时,所有条目都是正确的.但是,当我添加新条目或删除现有条目时,事情开始变得有趣.
>标题TextView始终设置正确
>主要布局的背景颜色看似随意变化,我假设因为RecyclerView正在重用旧版本
>就像我实现的自定义视图一样,即使我使它失效并传递新的值,这会显着改变它的外观
所以我想知道:一旦视图被重用,为什么onBindViewHolder()中的值不会改变?或者,如果我错了,布局随机切换的真正原因是什么?
TaskListAdapter
class TaskListAdapter extends RecyclerView.Adapter {
private ArrayList 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();
}
}
}
如果其他任何事情在这里重要,请告诉我.我很乐意相应地更新问题.