android - 如何在 RecyclerView.ViewHolder 中使用 kotlin 绑

让我疑惑的是如何在Recycleler.ViewHolder中绑定(bind) View 。 这是我的简单适配器以及如何将其转换为 kotlin 使用 kotlin-android-extensions 而不使用 ButterKnife

public class RoomAdapter extends RecyclerView.Adapter<ViewHolder> {

  private OnItemClickListener mListener;
  private List<LocationBean> mRooms;

  static class ViewHolder extends RecyclerView.ViewHolder {

  @BindView(R.id.tv_title)
  TextView tvTitle;

  public ViewHolder(View itemView) {
   super(itemView);
   ButterKnife.bind(this, itemView);
   }
  }

  public void setData(List<LocationBean> rooms) {
   mRooms = rooms;
   notifyDataSetChanged();
  }

  @Override
  public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
      .inflate(R.layout.item_first_select, parent, false);
    return new ViewHolder(view);
  }

  @Override
  public void onBindViewHolder(final ViewHolder holder, int position) {
  holder.tvTitle.setText(mRooms.get(position).getLocation());

  holder.itemView.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
      mListener.onItemClickListener(v, holder.getLayoutPosition());
     }
    });
  }

  @Override
  public int getItemCount() {
    return mRooms == null ? 0 : mRooms.size();
  }

  public void setOnItemClickListener(OnItemClickListener listener) {
    mListener = listener;
  }

  public interface OnItemClickListener {
    void onItemClickListener(View v, int pos);
  }

}

最佳答案

posted solution工作,但我想添加一些东西。 viewholder 模式的目的是只为每个 View 进行一次昂贵的 findViewById 调用,然后将这些引用保存在 ViewHolder 中,并在您随时从那里访问 View 需要绑定(bind)一个。

但是,在 onBindViewHolder 方法中调用 holder.itemView.tv_title.text 会导致调用 findViewById 来查找 View 在每次绑定(bind) View 时在 itemView 中具有 id tv_title。这基本上消除了查看器的性能提升和缓存想法。

您可以通过向您的 ViewHolder 添加一个属性并使用 Extensions 进行的调用对其进行初始化,从而同时使用 viewholder 模式和 Kotlin Android Extensions,如下所示:

class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val title = itemView.tv_title
}

然后就可以通过这个属性访问View了:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.title.text = mRooms!!.get(position).getLocation()

    holder.itemView.setOnClickListener { v ->
        mListener?.onItemClickListener(v, holder.layoutPosition)
    }
}

最后,我建议去掉 !! 运算符,改为执行空检查:

mRooms?.let { rooms ->
    holder.title.text = rooms[position].getLocation()
}

关于android - 如何在 RecyclerView.ViewHolder 中使用 kotlin 绑定(bind) View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44192550/

相关文章:

kotlin - Kotlin 是 "pass-by-value"还是 "pass-by-refer

java - Kotlin 数据类实现 Java 接口(interface)

android - 如何使用 Kotlin 设置 OnEditorActionListener

regex - 使用正则表达式在 Kotlin 中进行 URL 解析

java - Gradle 项目 : java. lang.NoClassDefFoundError

arrays - Kotlin 中的二维 Int 数组

java - 如何从 Kotlin/Java 中运行 Kotlin-Script (.kts) 文件

android - 实时模板在 Kotlin 中不起作用

android - 将项目添加到 LiveData 列表时通知观察者

kotlin - Kotlin 中的静态数据