让我疑惑的是如何在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
java - 如何从 Kotlin/Java 中运行 Kotlin-Script (.kts) 文件