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)RecyclerViewindividual 项被要求。如果每个 itemtext 不同,那么您应该使用 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. 如果每个 itemtext 是固定的,那么你可以按照你说的从 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,来自CacheRecyclerView.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)

中设置文本值