簡體   English   中英

在RecyclerView上獲取對ViewHolder的引用請點擊

[英]Getting a Reference to ViewHolder on RecyclerView Click

這是我實現RecyclerView第一次嘗試。 我已經在AdapterViewHolder類之間實現了Callback接口,以處理UI元素(按鈕)上的Click事件。 我在獲取對單擊發生的ViewHolder的引用時遇到了問題。我可以單擊列表中第一項的Button ,但是我定義的操作是在回收者視圖中的最后一個viewholder上執行的。 我終於想通了通過我的界面的位置,但我正在努力了解如何從中獲取對該視圖持有者的引用。

    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);
    }

}

在此處輸入圖片說明

你可以設置一個標簽editBtnonBindViewHolder

    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上調用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將通知您的onBindViewHolder,然后您可以執行以下操作

public void onBindViewHolder(RoomViewHolder roomViewHolder, int i) {
    Room r = getItem(i);
    roomViewHolder.label.setText(r.name);
    if(i == pos){ // Do Something }

}

每當您單擊該項目時,它都會更改pos的值並觸發//做某事

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