获取Recycler View上已点击项目的位置

时间:2015-11-23 09:07:24

标签: android android-recyclerview

我实现了RecyclerView,它运行正常。我有一个ArrayList,其中包含Recycler视图的数据。每个项目的布局都很复杂。它包含两个frameLayout。 framelayout1包含图像和文本,framelayout2包含图像和四个文本。当用户点击framelayout1时,我想打开Activity1,当用户点击framelayout2时,我想打开Activity2。我已经在Recycler View中搜索了onClick,我发现它非常有用this。但是如何获取arrayList的位置以便通过activity1或activity2中的Intent传递它?

3 个答案:

答案 0 :(得分:10)

在视图持有者中尝试getAdapterPosition(),这样您就可以获得用户点击的适配器位置。

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

   public ViewHolder(View itemView) {
       super(itemView);
       itemView.setOnClickListener(this);
   }

   @Override
   public void onClick(View v) {
       Toast.makeText(context, String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show();
       }
 }

有关getAdapterPosition()的更多信息,请按照此link

进行操作

答案 1 :(得分:1)

试试这个

public class ClosetListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    ClosetListAdapter (CallBack callback){
       this.callback = callback
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder baseholder, int position) {
        ViewHolder holder = (ViewHolder) baseholder;
        holder.setPosition(position);
        holder.name.setText(product.getName());
    }

    static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public TextView name = null;

        private OnProductClickListener onProductClickListener;

        public ViewHolder(View itemView, OnProductClickListener onClickListener) {
            super(itemView);

            name = (TextView) itemView.findViewById(R.id.item_name);
            itemView.setOnClickListener(this)

        }

        public void setProdcut(Product product) {
            this.product = product;
        }

        @Override
        public void onClick(View v) {
            if (callback!= null) {
                callback.itemClicked(pos);
            }
        }

        public void setPosition(int position){
            this.pos = position;
        }
    }

    interface CallBack {
       void itemClicked(int position);
    }
}

答案 2 :(得分:0)

我也遇到了同样的问题。

我想找到RecyclerView()中被单击/选中的项目的位置,并对该特定项目执行一些特定的操作。

getAdapterPosition()方法对于这些东西来说就像是一种魅力。经过一天的研究和尝试了许多其他方法之后,我发现了这种方法。

int position = getAdapterPosition();
Toast.makeText(this, "Position is: "+position, Toast.LENGTH_SHORT).show();

您不必使用任何其他方法。只需创建一个名为“ position”的全局变量,然后使用适配器的任何主要方法(类或类似方法)中的getAdapterPosition()对其进行初始化。

这是link的简要文档。

  

getAdapterPosition   在版本22.1.0中添加   int getAdapterPosition()   返回此ViewHolder表示的项目的Adapter位置。   请注意,如果有挂起的适配器更新,但是尚未进行新的布局传递,则此方法可能不同于getLayoutPosition()。   在下一次遍历布局之前,RecyclerView不会处理任何适配器更新。这可能会在用户在屏幕上看到的内容与适配器的内容之间产生暂时的不一致。这种不一致并不重要,因为它将小于16ms,但是如果您想使用ViewHolder位置来访问适配器,则可能会出现问题。有时,您可能需要获取确切的适配器位置才能响应用户事件执行某些操作。在这种情况下,您应该使用此方法来计算ViewHolder的Adapter位置。

很乐意提供帮助。随时提出疑问。