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

4 android swipe recycler-adapter android-recyclerview

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

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();
                }
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

bas*_*ien 15

简答

  1. 获取CardView项目的位置

    当我点击recyclerview中的cardView项目时,我需要获得该cardview项目的位置

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

    你也可以使用getAdapterPosition() - 参见/sf/answers/1952074351/

    编辑:如评论中所述,如果您需要实现滑动,请使用getAdapterPosition()方法 - 这可确保位置不会关闭.

  2. 发起一项活动

    基于我需要编写一个Intent活动

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

    Intent newIntent = new Intent(this, YourNewActivity.class);    
    startActivity(newIntent);
    
    Run Code Online (Sandbox Code Playgroud)

答案很长

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

当我点击recyclerview中的cardView项目时,我需要获得该cardview项目的位置

我使用了View 的setTag()getTag()方法.您也可以使用getAdapterPosition - 请参阅/sf/answers/1952074351/

视图可以是TextView,ImageView,CardView,甚至是视图(可以包含文本视图,图像视图等) - 如果它继承自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);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 为View对象定义一个常量,例如mView,并将其设置为您希望将onClickListener设置为/从中获取位置的视图.

    private class myViewHolder extends RecyclerView.ViewHolder {
        public View mView;
    
        public myViewHolder(View view) {
            super(view);
            mView = view;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    在前一种情况下,我将mView设置为父视图.

    如果要从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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 在适配器类的onBindViewHolder方法中使用setTag().现在,每个CardView都在RecyclerView列表中作为标记位置.

    @Override
    public void onBindViewHolder(myViewHolder viewHolder, int position) {
        viewHolder.mCardView.setTag(position);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用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();
    }
    
    Run Code Online (Sandbox Code Playgroud)

    或者在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>
    
    Run Code Online (Sandbox Code Playgroud)

    并在包含回收器视图的活动中创建一个方法.

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

对于上面的两个选项,您可以使用String position = "Position " + view.getTag.toString();而不是int position = (int) view.getTag;如果要获取作为String的位置.

注意1:您只能在已调用setTag()方法的View对象上使用getTag(),否则您将获得NullPointerException.

注意2:我没有使用setTag()和getTag()方法的密钥,如果你为每个View设置了几个标签,你可以这样做.

如何基于单击的CardView启动活动?

基于我需要编写一个Intent活动

要基于用户单击的CardView项启动新活动,请在onClick方法或positionAction方法中添加以下两行(基于您选择使用的那一行).

Intent newIntent = new Intent(this, YourNewActivity.class);    
startActivity(newIntent);
Run Code Online (Sandbox Code Playgroud)

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

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

并在新活动(YourNewActivity类)中:

itemReceived = new Item();
itemReceived = (Item) getIntent().getSerializableExtra("Item Object");
Run Code Online (Sandbox Code Playgroud)

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

参考文献: StackOverflow | TUTS +