設置我有一個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