Android - 编程风格 - RecyclerView - 在 ViewHolder 或 onBindViewHolder 中使用 SetText?
Android - Programming Style - RecyclerView - Use SetText in ViewHolder or in onBindViewHolder?
将 OnClickListeners
设置为 RecyclerView
中的项目时,建议在内部 class 中这样做:
public ViewHolder(View itemView) {
super(itemVIew);
nameTextView = (TextView) itemView.findViewById(R.id.item_name);
itemView.setOnClickListener(this);
}
当我看到设置文本的代码时,它通常在 onBindViewHolder
方法中:
@Override
public void onBindViewHolder(SetPlayerNameViewHolder holder, int position) {
holder.nameTextView.setText(String.valueOf("Random Text"));
}
如果文本永远不会改变,它不应该在内部 class 吗?
public ViewHolder(View itemView) {
super(itemVIew);
nameTextView = (TextView) itemView.findViewById(R.id.item_name);
nameTextView.setText(String.valueOf("Random Text"));
itemView.setOnClickListener(this);
}
编辑:如果您检索到一个对所有 TextViews
都不同的值,但在 RecyclerView
重新加载它时不应更新该值怎么办
public ViewHolder(View itemView) {
super(itemVIew);
nameTextView = (TextView) itemView.findViewById(R.id.item_name);
// Not the actual methods, but to make it more readable
int i = itemView.getPosition()
String randomText = getTextFromDatabaseWhereRowIs(i)
nameTextView.setText(String.valueOf(randomText));
itemView.setOnClickListener(this);
}
是的,你是对的...
1. onBindViewHolder(..., int position)
因 RecyclerView
的 individual
项被要求。如果每个 item
的 text
不同,那么您应该使用 onBindViewHolder()
使用 position
来获得正确的 text
.
@Override
public void onBindViewHolder(SetPlayerNameViewHolder holder, int position) {
String item = YourList.get(position); // For example YourList is an ArrayList of String
holder.nameTextView.setText(item);
}
2. 如果每个 item
的 text
是固定的,那么你可以按照你说的从 ViewHolder
设置它,或者你可以它使用 android:text="YOUR_TEXT"
.
从 TextView XML
修复
public ViewHolder(View itemView) {
super(itemVIew);
nameTextView = (TextView) itemView.findViewById(R.id.item_name);
nameTextView.setText("Random Text");
}
希望对你有所帮助~
This method internally calls onBindViewHolder(ViewHolder, int) to update the RecyclerView.ViewHolder contents with the item at the given position and also sets up some private fields to be used by RecyclerView.
您从参数中收到的ViewHolder,来自Cache
或RecyclerView.RecycledViewPool
。
RecycledViewPool lets you share Views between multiple RecyclerViews.
If you want to recycle views across RecyclerViews, create an instance of RecycledViewPool and use setRecycledViewPool(RecycledViewPool).
RecyclerView automatically creates a pool for itself if you don't provide one.
因此,如果您没有在不同的 RecyclerView
中使用相同的 viewType
和相同的布局,其中 TextView
的文本在每个 RecyclerView
中都不同,那么你是对的。但是如果你这样做,那么 RecyclerView
可能不会调用 createViewHolder(ViewGroup parent, int viewType)
,因为它可能是来自 RecycledViewPool
的 viewHolder。在这种情况下,您可以在 onViewAttachedToWindow(VH holder)
中设置文本值
将 OnClickListeners
设置为 RecyclerView
中的项目时,建议在内部 class 中这样做:
public ViewHolder(View itemView) {
super(itemVIew);
nameTextView = (TextView) itemView.findViewById(R.id.item_name);
itemView.setOnClickListener(this);
}
当我看到设置文本的代码时,它通常在 onBindViewHolder
方法中:
@Override
public void onBindViewHolder(SetPlayerNameViewHolder holder, int position) {
holder.nameTextView.setText(String.valueOf("Random Text"));
}
如果文本永远不会改变,它不应该在内部 class 吗?
public ViewHolder(View itemView) {
super(itemVIew);
nameTextView = (TextView) itemView.findViewById(R.id.item_name);
nameTextView.setText(String.valueOf("Random Text"));
itemView.setOnClickListener(this);
}
编辑:如果您检索到一个对所有 TextViews
都不同的值,但在 RecyclerView
重新加载它时不应更新该值怎么办
public ViewHolder(View itemView) {
super(itemVIew);
nameTextView = (TextView) itemView.findViewById(R.id.item_name);
// Not the actual methods, but to make it more readable
int i = itemView.getPosition()
String randomText = getTextFromDatabaseWhereRowIs(i)
nameTextView.setText(String.valueOf(randomText));
itemView.setOnClickListener(this);
}
是的,你是对的...
1. onBindViewHolder(..., int position)
因 RecyclerView
的 individual
项被要求。如果每个 item
的 text
不同,那么您应该使用 onBindViewHolder()
使用 position
来获得正确的 text
.
@Override
public void onBindViewHolder(SetPlayerNameViewHolder holder, int position) {
String item = YourList.get(position); // For example YourList is an ArrayList of String
holder.nameTextView.setText(item);
}
2. 如果每个 item
的 text
是固定的,那么你可以按照你说的从 ViewHolder
设置它,或者你可以它使用 android:text="YOUR_TEXT"
.
XML
修复
public ViewHolder(View itemView) {
super(itemVIew);
nameTextView = (TextView) itemView.findViewById(R.id.item_name);
nameTextView.setText("Random Text");
}
希望对你有所帮助~
This method internally calls onBindViewHolder(ViewHolder, int) to update the RecyclerView.ViewHolder contents with the item at the given position and also sets up some private fields to be used by RecyclerView.
您从参数中收到的ViewHolder,来自Cache
或RecyclerView.RecycledViewPool
。
RecycledViewPool lets you share Views between multiple RecyclerViews. If you want to recycle views across RecyclerViews, create an instance of RecycledViewPool and use setRecycledViewPool(RecycledViewPool). RecyclerView automatically creates a pool for itself if you don't provide one.
因此,如果您没有在不同的 RecyclerView
中使用相同的 viewType
和相同的布局,其中 TextView
的文本在每个 RecyclerView
中都不同,那么你是对的。但是如果你这样做,那么 RecyclerView
可能不会调用 createViewHolder(ViewGroup parent, int viewType)
,因为它可能是来自 RecycledViewPool
的 viewHolder。在这种情况下,您可以在 onViewAttachedToWindow(VH holder)