+-
android – 如何使用kotlin绑定RecyclerView.ViewHolder中的视图
令我困惑的是如何在Recycleler.ViewHolder中绑定视图.
这是我的简单适配器以及如何将它转换为kotlin而不使用ButterKnife使用kotlin- android-extensions?

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工作,但我想添加一些东西.视图模式的目的是仅对每个视图进行一次昂贵的findViewById调用,然后在ViewHolder中保存这些引用,并在需要绑定视图时从那里访问视图.

但是,在onBindViewHolder方法中调用holder.itemView.tv_title.text将导致findViewById调用在每次绑定视图时查找itemView中具有id tv_title的View.这基本上消除了观看者所要求的性能提升和缓存理念.

您可以通过向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 – 如何使用kotlin绑定RecyclerView.ViewHolder中的视图 - 乐贴网