当前位置: 首页 > 知识库问答 >
问题:

在RecyclerView上获取对ViewHolder的引用单击

劳昊明
2023-03-14

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

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

}

共有3个答案

穆宾白
2023-03-14
@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 '值,并触发//做一些事情

卢光远
2023-03-14

实际上,您可以通过在RecyclView上调用getChildViewHolder(View child)来做得比getTag更好:

@Override
public void onClick(View v) {
    MyHolder holder = (MyHolder) mRecyclerView.getChildViewHolder(v);
    holder.textView.setText("Clicked!");
}
欧阳绪
2023-03-14

您可以在onBindViewHolder中为editBtn设置标签:

    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。对于第一个选项卡,它显示得很好,但是当我滑动到第二个选项卡然后又回到第一个选项卡时,出现以下错误: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ void android.support.v7.widget.RecyclerView $ LayoutManager.stopSmoothSc

  • 我正试图使用cardview显示RecycerView的联系人,但我得到了这个错误:

  • 我正在OnItemClickListener接口的OnItemClicked(int position,view v)方法中传递position和view。现在,在我的ViewReceptionistActivity中,我要检查单击了哪个项和哪个子部分。如果用户单击图像,则执行任务A,如果用户单击名称,则执行任务B,依此类推。 下面是我的布局文件-viewreceptionist_item.xml

  • 问题内容: 在Swift 1.2中,有一个Set对象,可用于创建静态类型的Set。 我无法找到如何在某个索引处获取对象。它具有,您可以执行以下操作:。 这将检索到该对象。但是现在我想从某个索引中获取一个对象。 但是,如何创建具有特定“索引”的SetIndex? 问题答案: Swift 3及更高版本 您可以从: Swift 2(已淘汰) 您可以从: Swift 1.x(已淘汰) 与相似,您必须从:

  • 问题内容: 如果知道与该线程关联的ID,该如何获取正在运行的线程的引用? 例如 问题答案: 您有2种方法可以做到。两者都很简单: 旧方法:获取您可以循环访问..getParent()的根线程组。并打电话 较新(但速度较慢)。 第一种方法有一个小问题,由于存在错误,ThreadGroup可能根本无法枚举任何东西。 第二个比较慢,但是有安全漏洞。

  • 我面临以下问题:我的类继承了。这个工作器的逻辑足够复杂,事实上调用了里面的一堆其他例程并捕获()几个的结果,例如: 问题: 我可以以某种方式将收集的值(值是简单的原始对象)返回/放置给? 或者作为一种选择-我如何在其他类中收听/收集这些-在我的之外? 因为,