首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取RecyclerView上ViewHolder的参考资料单击

获取RecyclerView上ViewHolder的参考资料单击
EN

Stack Overflow用户
提问于 2014-11-12 22:28:22
回答 4查看 56.1K关注 0票数 25

这是我第一次尝试实现RecyclerView。我在Adapter和Click类之间实现了一个Callback接口来处理UI元素(按钮)上的ViewHolder事件。我在获取发生单击的ViewHolder的引用时遇到问题。我可以单击列表中第一个项目的Button,但是,我定义的操作是在回收器视图中的最后一个viewholder上执行的。我终于想出了通过我的界面来传递这个职位,但我正在努力理解如何从它中获得对那个vieholder`的引用。

代码语言:javascript
复制
    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);
    }

}

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-15 11:54:11

您可以在onBindViewHolder中为editBtn设置标记

代码语言:javascript
复制
    public RoomViewHolder(View itemView, IRoomViewClick listener) {
        ....
        editBtn =(Button) itemView.findViewById(R.id.editbtn);
        //add tag for this view
        editBtn.setTag(this);
        ....
   }

并在onClick中获取它

代码语言:javascript
复制
    @Override
    public void onClick(View view) {
        //getTag
        RoomViewHolder holder = (RoomViewHolder )(view.getTag());
        int pos = getPosition();
        mListener.editname(pos);
    ...
    }
票数 25
EN

Stack Overflow用户

发布于 2016-06-09 10:48:43

实际上,你可以通过在getTag上调用getChildViewHolder(View child)来做比RecyclerView更好的事情:

代码语言:javascript
复制
@Override
public void onClick(View v) {
    MyHolder holder = (MyHolder) mRecyclerView.getChildViewHolder(v);
    holder.textView.setText("Clicked!");
}
票数 13
EN

Stack Overflow用户

发布于 2015-08-11 00:29:01

代码语言:javascript
复制
@Override
public void onClick(View v) {
    int pos = getAdapterPosition(); //getPosition() is deprecated 
    notifyItemChanged(pos);
}

notifyItemChanged会通知你的onBindViewHolder,然后你就可以这样做了

代码语言:javascript
复制
public void onBindViewHolder(RoomViewHolder roomViewHolder, int i) {
    Room r = getItem(i);
    roomViewHolder.label.setText(r.name);
    if(i == pos){ // Do Something }

}

无论何时点击该项目,它都会更改pos的值,并触发//执行某些操作

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26889361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档