gpt4 book ai didi

android - 如何在 RecyclerView.ViewHolder 中使用 kotlin 绑定(bind) View

转载 作者:IT老高 更新时间:2023-10-28 13:28:18 24 4
gpt4 key购买 nike

让我疑惑的是如何在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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com