[英]Getting a Reference to ViewHolder on RecyclerView Click
This is my first attempt at implementing the RecyclerView
. 这是我实现
RecyclerView
第一次尝试。 I have implemented a Callback
interface between the Adapter
and the ViewHolder
Class to handle Click Events on the UI elements (buttons). 我已经在
Adapter
和ViewHolder
类之间实现了Callback
接口,以处理UI元素(按钮)上的Click事件。 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. 我在获取对单击发生的
ViewHolder
的引用时遇到了问题。我可以单击列表中第一项的Button
,但是我定义的操作是在回收者视图中的最后一个viewholder
上执行的。 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);
}
}
you can set a tag for the editBtn
in onBindViewHolder
: 你可以设置一个标签
editBtn
在onBindViewHolder
:
public RoomViewHolder(View itemView, IRoomViewClick listener) {
....
editBtn =(Button) itemView.findViewById(R.id.editbtn);
//add tag for this view
editBtn.setTag(this);
....
}
and get it in onClick
并将其放入
onClick
@Override
public void onClick(View view) {
//getTag
RoomViewHolder holder = (RoomViewHolder )(view.getTag());
int pos = getPosition();
mListener.editname(pos);
...
}
Actually you can do better than getTag
by calling getChildViewHolder(View child)
on the RecyclerView: 实际上,通过在RecyclerView上调用
getChildViewHolder(View child)
,您可以比getTag
做得更好:
@Override
public void onClick(View v) {
MyHolder holder = (MyHolder) mRecyclerView.getChildViewHolder(v);
holder.textView.setText("Clicked!");
}
@Override
public void onClick(View v) {
int pos = getAdapterPosition(); //getPosition() is deprecated
notifyItemChanged(pos);
}
notifyItemChanged will notify your onBindViewHolder, then you can do something like this notifyItemChanged将通知您的onBindViewHolder,然后您可以执行以下操作
public void onBindViewHolder(RoomViewHolder roomViewHolder, int i) {
Room r = getItem(i);
roomViewHolder.label.setText(r.name);
if(i == pos){ // Do Something }
}
Whenever you click the item, it will change pos' value and trigger the // Do Something 每当您单击该项目时,它都会更改pos的值并触发//做某事
Turn out that RecycleView
saves the view position in the view layout params, so if you just want the view position from to get the right item from the list you can use this: RecycleView
证明, RecycleView
将视图位置保存在视图布局参数中,因此,如果您只希望视图位置从列表中获取正确的项目,则可以使用以下方法:
RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) v.getLayoutParams();
lp.getViewPosition();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.