简体   繁体   English

在RecyclerView上获取对ViewHolder的引用请点击

[英]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). 我已经在AdapterViewHolder类之间实现了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 : 你可以设置一个标签editBtnonBindViewHolder

    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM