如何获取cardView item在recyclerView中的位置?

How to get the position of cardView item in recyclerView?

我为 recycler 创建了一个适配器 class,用于在 recyclerview 中填充 cardview 布局。它工作正常,但是当我在 recyclerview 中单击 cardView 项目时,我需要获取该 cardview 项目的位置,基于此我需要编写一个 Intent activity。以及当我从左向右滑动时如何删除该 cardview 项目。 MyAdapter class.

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private NavigationItem[] navigationItem;
    private Context mContext;

    public MyAdapter(NavigationItem[] navigationItem) {
        this.navigationItem = navigationItem;
    }

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemLayoutView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.navigation_row_cardview, null);
        ViewHolder viewHolder = new ViewHolder(itemLayoutView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) {
        holder.txtViewTitle.setText(navigationItem[position].getTitle());
    }

    @Override
    public int getItemCount() {
        return navigationItem.length;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @InjectView(R.id.hambergerRecyclerView)
        public RelativeLayout recyclerView;
        public TextView txtViewTitle;

        public ViewHolder(final View itemLayoutView) {
            super(itemLayoutView);
            ButterKnife.inject(this, itemLayoutView);
            txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.navigationItemOptionName);

            itemLayoutView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // int itemPosition = RecyclerView.getChildPosition(view);
                    int itemPosition = recyclerView.getChildAdapterPosition(view);
                    String item = navigationItem.get(itemPosition);
                    Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
                }
            });
        }
    }
}

onBindViewHolder中执行onClick,你就会得到位置。

像这样更新你的viewholder

public class ViewHolder extends RecyclerView.ViewHolder { 
    @InjectView(R.id.hambergerRecyclerView)
    public RelativeLayout recyclerView;
    public TextView txtViewTitle;
    public ViewHolder(final View itemLayoutView) {
        super(itemLayoutView);
        ButterKnife.inject(this, itemLayoutView);
        txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.navigationItemOptionName);

        itemLayoutView.setOnClickListener(new View.OnClickListener() {
            @Override 
            public void onClick(View view) {
               //int itemPosition = RecyclerView.getChildPosition(view); 
                int itemPosition=getAdapterPosition();
                String item = navigationItem.get(itemPosition);
                Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
            } 
        }); 
    } 


} 

您可以尝试将位置从 onBindViewHolder

传递给 ViewHolder
@Override   
public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) {
    holder.txtViewTitle.setText(navigationItem[position].getTitle());
    //set position to holder
    holder.position = position; 
}


public class ViewHolder extends RecyclerView.ViewHolder {
        @InjectView(R.id.hambergerRecyclerView)
        public RelativeLayout recyclerView;
        public TextView txtViewTitle;
        //have a position field in view holder
        public int position;

        public ViewHolder(final View itemLayoutView) {
            super(itemLayoutView);
            ButterKnife.inject(this, itemLayoutView);
            txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.navigationItemOptionName);

            itemLayoutView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // int itemPosition = RecyclerView.getChildPosition(view);
                    int itemPosition = position;
                    String item = navigationItem.get(itemPosition);
                    Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
                }
            });
        }
}

简答

  1. 获取 CardView 项目的位置

    when i click cardView item in recyclerview i need to get position of that cardview item

    在适配器的 onBindViewHolder 方法中使用 setTag(),在 OnClickListener 实现中使用 getTag()

    您还可以使用 getAdapterPosition() - 请参阅

    编辑: 如评论中所述,如果您需要实现滑动,请改用 getAdapterPosition() 方法 - 这可确保位置不偏离。

  2. 正在启动 activity

    based on that i need to write a Intent activity

    在您的 OnClickListener 实现中创建并启动一个新的 Intent

    Intent newIntent = new Intent(this, YourNewActivity.class);    
    startActivity(newIntent);
    

长答案

如何获取 CardView 项在 RecyclerView 列表中的位置?

when i click cardView item in recyclerview i need to get position of that cardview item

我使用了 View 的 setTag()getTag() 方法。 您还可以使用 getAdapterPosition - 请参阅

View 可以是 TextView、ImageView、CardView,甚至是 View(可以包含文本视图、图像视图等)- 如果它继承自 View 对象,基本上就可以了。

  • 首先看下面的onCreateViewHolder方法。 layoutInflater 膨胀了我的 XML 布局文件 item_view.xml 中的视图。该布局文件中的任何视图都可以在构造函数中访问。

    @Override
    public myViewHolder onCreateViewHolder(ViewGroup parentViewGroup, int i) {
        ...
    
        View itemView = layoutInflater.inflate(R.layout.item_view, parentViewGroup, false);
        return new myViewHolder(itemView);
    }
    
  • 为您的 View 对象定义一个常量,例如 mView,并将其设置为您希望将 onClickListener 设置为/从中获取位置的 View。

    private class myViewHolder extends RecyclerView.ViewHolder {
        public View mView;
    
        public myViewHolder(View view) {
            super(view);
            mView = view;
        }
    }
    

    在前面的例子中,我将mView设置为父View。

    如果您想从在 onCreateViewHolder 中膨胀的 item_view.xml 布局文件访问特定的视图 -- 定义另一个常量,使用 view.findViewbyId() 设置它并且不要忘记转换视图 (见下文)。

    private class myViewHolder extends RecyclerView.ViewHolder {
        public CardView mCardView;
    
        public myViewHolder(View view) {
            super(view);
            mCardView = (CardView) view.findViewById(R.id.card_view);
        }
    }
    
  • 在适配器的 onBindViewHolder 方法中使用 setTag() class。每个 CardView 现在在 RecyclerView 列表中都有自己的位置作为标签。

    @Override
    public void onBindViewHolder(myViewHolder viewHolder, int position) {
        viewHolder.mCardView.setTag(position);
    }
    
  • 使用 getTag() 获取 RecyclerView 列表中每个 CardView 的位置:我们有两种方法(在 Activity 或 XML 中)。

    在您的 ViewHolder 构造函数中设置 onClickListener(不要忘记实现 View.OnClickListener)并编辑 onClick 方法

    private class myViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
               public View mCardView;
    
               public myViewHolder(View view) {
                   super(view);
                   mCardView = (CardView) view.findViewById(R.id.card_view);
    
                   mCardView.setOnClickListener(this);
               }
           }
    
    @Override
    public void onClick(View view) {
        int position = (int) view.getTag();           
        Toast.makeText(view.getContext(),Integer.toString(position),Toast.LENGTH_SHORT).show();
    }
    

    在 CardView XML 布局中设置 onClick 属性 android:onClick="positionAction"

    <android.support.v7.widget.CardView
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="positionAction">    
    
    </android.support.v7.widget.CardView>
    

    并在 activity 中创建一个包含回收器视图的方法。

    public void positionAction(View view) {
        int position = (int) view.getTag();
        Toast.makeText(view.getContext(),Integer.toString(position),Toast.LENGTH_SHORT).show();
    }
    

对于以上两个选项,如果您想以字符串形式获取位置,则可以使用 String position = "Position " + view.getTag.toString(); 而不是 int position = (int) view.getTag;

注意1:你只能在调用了setTag()方法的View对象上使用getTag()方法(否则你会得到一个NullPointerException)。

注意 2:我没有为 setTag() 和 getTag() 方法使用密钥,如果您为每个视图设置多个标签,您可以这样做。

如何根据点击的 CardView 启动 activity?

based on that i need to write a Intent activity

要根据用户点击的 CardView 项开始新的 activity,请在 onClick 方法或 positionAction 方法(基于您选择使用的方法)中添加以下两行。

Intent newIntent = new Intent(this, YourNewActivity.class);    
startActivity(newIntent);

如果要将对象从一个 activity 传递到另一个,请使用

Intent newIntent = new Intent(this, YourNewActivity.class);
newIntent.putExtra("Item Object", itemList.get(position));
startActivity(newIntent);

并在新的 activity (YourNewActivity class) 中:

itemReceived = new Item();
itemReceived = (Item) getIntent().getSerializableExtra("Item Object");

其中 itemList 是 Item() 对象的 ArrayList。

参考文献:Whosebug | Tuts+

在适配器

中的 onBindViewHolder 上试试这个
myViewHolder1.itemView.setTag(new Integer(position));

然后在你的 OnClickListener 上像这样:

Integer pos;
pos = (Integer) view.getTag();