在 RecyclerView 上获取对 ViewHolder 的引用单击 [英] Getting a Reference to ViewHolder on RecyclerView Click
问题描述
这是我第一次尝试实现 RecyclerView
.我在 Adapter
和 ViewHolder
类之间实现了一个 Callback
接口来处理 UI 元素(按钮)上的点击事件.我在获取对发生单击的 ViewHolder
的引用时遇到问题.我可以单击列表中第一项的 Button
,但是我要执行的操作在我的回收器视图中的最后一个 viewholder
上执行了定义.我终于想出了通过我的界面传递位置的方法,但我很难理解如何从中获取对该 viewholder` 的引用.
This is my first attempt at implementing the RecyclerView
. I have implemented a Callback
interface between the Adapter
and the ViewHolder
Class to handle Click Events on the UI elements (buttons). I am having problems getting a reference to the ViewHolder
that the click occurred in. I can click the Button
for the first item in the list, however the action that i'd defined is performed on the last viewholder
in my recycler view. I finally figured out to pass the position through my interface, but I'm struggling to understand how to get a reference to that viewholder` from it.
public class RoomAdapter extends RecyclerView.Adapter<RoomAdapter.RoomViewHolder>
{
List<Room> mRooms;
public RoomAdapter(List<Room> rooms) {
mRooms = rooms;
}
@Override
public RoomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
final View viewItem = LayoutInflater
.from(viewGroup.getContext())
.inflate(R.layout.room_rv_item,viewGroup,false);
return vh = new RoomViewHolder(viewItem,new IRoomViewClick() {
@Override
public void editname(int pos) {
}
});
}
@Override
public void onBindViewHolder(RoomViewHolder roomViewHolder, int i) {
Room r = getItem(i);
roomViewHolder.label.setText(r.name);
}
public Room getItem(int position)
{
return mRooms.get(position);
}
@Override
public long getItemId(int position) {
return mRooms.get(position).getId();
}
@Override
public int getItemCount() {
return mRooms.size();
}
public static class RoomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{
TextView label;
Button editBtn;
LinearLayout labelView;
Button saveBtn;
Button deleteBtn;
EditText editNameET;
IRoomViewClick mListener;
public RoomViewHolder(View itemView, IRoomViewClick listener) {
super(itemView);
labelView = (LinearLayout) itemView.findViewById(R.id.labelview);
mListener = listener;
editBtn =(Button) itemView.findViewById(R.id.editbtn);
editBtn.setOnClickListener(this);
label = (TextView) itemView.findViewById(R.id.room_listitem_label);
}
@Override
public void onClick(View view) {
int pos = getPosition();
mListener.editname(pos);
}
}
public static interface IRoomViewClick
{
public void editname(int pos);
}
}
推荐答案
你可以为onBindViewHolder
中的editBtn
设置标签:
you can set a tag for the editBtn
in onBindViewHolder
:
public RoomViewHolder(View itemView, IRoomViewClick listener) {
....
editBtn =(Button) itemView.findViewById(R.id.editbtn);
//add tag for this view
editBtn.setTag(this);
....
}
并在 onClick
@Override
public void onClick(View view) {
//getTag
RoomViewHolder holder = (RoomViewHolder )(view.getTag());
int pos = getPosition();
mListener.editname(pos);
...
}
这篇关于在 RecyclerView 上获取对 ViewHolder 的引用单击的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!