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

时间:2015-09-09 07:46:41

标签: android swipe android-recyclerview recycler-adapter

我为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();
                }
            });
        }
    }
}

5 个答案:

答案 0 :(得分:15)

简答

  1. 获取CardView项目的位置

      

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

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

    您也可以使用getAdapterPosition() - 请参阅https://stackoverflow.com/a/27886776/4658957

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

  2. 启动活动

      

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

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

    Intent newIntent = new Intent(this, YourNewActivity.class);    
    startActivity(newIntent);
    
  3. 长答案

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

      

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

    我使用了View的 setTag() getTag()方法。  您也可以使用getAdapterPosition - 请参阅https://stackoverflow.com/a/27886776/4658957

    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设置为/从中获取位置的视图。

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

      在前一种情况下,我将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);
          }
      }
      
    • 在适配器类的onBindViewHolder方法中使用setTag()。现在,每个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();
      }
      

      OR 在CardView android:onClick="positionAction"

      的XML布局中设置onClick属性
      <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>
      

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

      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()方法的密钥,如果你为每个View设置了几个标签,你可以这样做。

    如何根据单击的CardView启动活动?

      

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

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

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

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

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

    并在新活动(YourNewActivity类)中:

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

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

    参考文献:StackOverflow | Tuts+

答案 1 :(得分:2)

onBindViewHolder中实施 (id=1, flagged=1) (id=1, flagged=0) (id=1, flagged=0) ,然后您将获得排名。

答案 2 :(得分:2)

像这样更新你的观众

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


} 

答案 3 :(得分:1)

您可以尝试将位置从ViewHolder

传递到onBindViewHolder
@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();
                }
            });
        }
}

答案 4 :(得分:0)

在适配器中的onBindViewHolder

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

并在OnClickListener

上得到这样的结果
Integer pos;
pos = (Integer) view.getTag();