【问题标题】:Android - Programming Style - RecyclerView - Use SetText in ViewHolder or in onBindViewHolder?Android - 编程风格 - RecyclerView - 在 ViewHolder 或 onBindViewHolder 中使用 SetText?
【发布时间】:2017-04-22 14:11:59
【问题描述】:

OnClickListeners 设置为RecyclerView 中的项目时,建议在内部类中这样做:

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"));
}

如果文本永远不会改变,它不应该在内部类中吗?

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);
}

【问题讨论】:

    标签: android data-binding android-recyclerview settext android-viewholder


    【解决方案1】:

    是的,你是对的......

    1. onBindViewHolder(..., int position) 被调用individual RecyclerView 的项目。如果您的text 对于每个item 都不同,那么您应该从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");
    }
    

    希望对你有帮助~

    【讨论】:

      【解决方案2】:

      此方法内部调用 onBindViewHolder(ViewHolder, int) 以使用给定位置的项目更新 RecyclerView.ViewHolder 内容,并设置一些私有字段供 RecyclerView 使用。

      您从参数中收到的 ViewHolder 来自CacheRecyclerView.RecycledViewPool

      RecycledViewPool 让您可以在多个 RecyclerView 之间共享 View。 如果要跨 RecyclerView 回收视图,请创建 RecycledViewPool 的实例并使用 setRecycledViewPool(RecycledViewPool)。 如果您不提供,RecyclerView 会自动为自己创建一个池。

      因此,如果您没有使用相同的viewType 和不同的RecyclerView 的相同布局,其中TextView 的文本在每个RecyclerView 中是不同的,那么您是对的。但是如果你这样做,那么RecyclerView 可能不会调用createViewHolder(ViewGroup parent, int viewType),因为它可能是来自RecycledViewPool 的viewHolder。在这种情况下,您可以在onViewAttachedToWindow(VH holder)中设置文本值

      【讨论】:

        猜你喜欢
        • 2018-12-04
        • 1970-01-01
        • 1970-01-01
        • 2018-03-19
        • 2015-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多