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

2023-11-26

我为回收器创建了一个适配器类,用于在回收器视图中填充卡片视图布局。它工作正常,但是当我单击 recyclerview 中的 cardView 项目时,我需要获取该 cardview 项目的位置,基于此我需要编写一个 Intent 活动。以及当我从左向右滑动时如何删除该卡片视图项目。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();
                }
            });
        }
    }
}

简答

  1. 获取CardView项目的位置

    当我单击 recyclerview 中的 cardView 项目时,我需要获取的位置 该卡片视图项目

    use setTag()在适配器的 onBindViewHolder 方法中getTag()在您的 OnClickListener 实现中。

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

    EDIT:正如评论中提到的,如果您需要实现滑动,请使用 getAdapterPosition() 方法 - 这可以确保位置不会关闭。

  2. 发起活动

    基于此我需要编写一个意图活动

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

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

长答案

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

当我单击 recyclerview 中的 cardView 项目时,我需要获取的位置 该卡片视图项目

我用的是setTag() and 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 设置为/从中获取位置的 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() 。现在,每个 CardView 在 RecyclerView 列表中都有其位置作为标签。

    @Override
    public void onBindViewHolder(myViewHolder viewHolder, int position) {
        viewHolder.mCardView.setTag(position);
    }
    
  • 使用 getTag() 访问 RecyclerView 列表中每个 CardView 的位置:我们有 2 种方法(在 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 的 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>
    

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

    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?

基于此我需要编写一个意图活动

要根据用户单击的 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。

参考:堆栈溢出 | Tuts+

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取cardView item在recyclerView中的位置? 的相关文章

随机推荐

  • .NET 中的多线程和闭包

    如果我有这个 public string DoSomething string arg string someVar arg DoStuffThatMightTakeAWhile return SomeControl Invoke new
  • Div 占据整个剩余宽度[重复]

    这个问题在这里已经有答案了 我有一个父 div 和里面的 2 个 div 第一个子 div 宽 50 像素 高 100 第二个子 div 的高度为 100 我用它来占据其余的宽度 100 50px 我该怎么做 这是我创建的小提琴 http
  • SQL Server 搜索“ὡ”(U+1F61) 匹配所有内容?

    我们的一位 QA 工程师偶然发现了这一点 SELECT DisplayName FROM Products WHERE DisplayName LIKE N 此查询与 100 的 DisplayName 值匹配 即使它们都不包含 U 1F6
  • Maven:从属性文件中设置 pom.xml 中的属性

    我有一个多模块项目 对不同模块版本有很多依赖性 目前版本是硬编码的 需要手动更改它们 因此 我决定将它们全部放入属性文件中 并在项目构建期间从中获取属性值 我尝试这样做的方法如下 根pom xml
  • 在 Python 2.7 中导入“urllib3.util”失败?

    我正在编写别人编写的 Python 脚本 我试图让它在我的本地开发计算机上运行而不会出现任何问题 我已经安装了脚本所需的模块 requests urllib3 和 oath2 但是我遇到了以下错误 我正在努力解决该错误 Traceback
  • 计算长宽比的算法是什么?

    我计划将它与 JavaScript 一起使用来裁剪图像以适合整个窗口 Edit 我将使用仅接受以下格式的长宽比的第三方组件 4 3 16 9 我猜您正在寻找可用的宽高比integer integer解决方案就像16 9而不是一个float
  • 动态 Func、IOrderedQueryable> 表达式

    我正在使用这里提到的模式http www asp net mvc tutorials getting started with ef using mvc implementing the repository and unit of wor
  • 如何使用 Selenium/Protractor 设置 HTML5 type="date" 输入字段(例如在 Chrome 中)?

    我想更新一些 HTML5 日期表单字段的日期值 显示为 mm dd yyyy 仅数字部分可修改
  • Google Apps 脚本文本旋转

    我在 Google 电子表格的 UI 中发现了文本旋转功能 但在 google apps 脚本中没有找到相同的功能 那么我如何使用 Google Apps 脚本旋转文本呢 Regards 编辑 我创建了一个电子表格 将所需的旋转作为默认设置
  • 如何编辑“select”标签中的“onchange”属性? (使用jquery)

    我正在尝试编辑现有 select 元素的 onchange 事件 出于示例目的 我有以下代码
  • C 中局部变量初始化为零

    我以为C中的局部变量没有初始化 但是当我用 gcc 编译这段代码时 void f static int s int n printf static s d n s printf local n d n n f main f 并运行这段代码
  • 按组对名称以模式开头的所有列求和

    我对 R 相当陌生 我正在尝试根据列的名称按组对列进行求和 我有一个像这样的数据框 DT lt data frame a011 c 0 10 20 0 a012 c 010 10 0 0 a013 c 10 30 0 10 a021 c 1
  • 根据构面的存在有条件地修改 ggplot 主题?

    我正在开发一个自定义 ggplot2 主题 并认为根据绘图对象的某些特征自动修改主题元素可能会很漂亮 例如 是否有一种方法可以指定如果绘图包含小平面 则为每个面板添加边框 我想问题确实是 我可以从自定义 theme 调用中访问当前的 gg
  • 拦截浏览器的图片加载请求

    我想知道是否有一种方法可以拦截浏览器的图像加载请求并添加一些服务器期望的请求标头 实际场景是这样的 Web 应用程序向服务器发送 XHR 并完成身份验证握手 所有后续请求都必须包含 auth 标头 由于浏览器不发送图像请求的标头 图像已损坏
  • 扩展 ASP.NET 身份

    似乎这个问题已经以多种方式被问过很多次了 但似乎都不符合我的具体情况 这是我的 LoginPartial cshtml 文件中的一行 Html ActionLink Hello User Identity GetUserName Manag
  • INT 10, 13h 如何与属性一起使用?

    嘿 我试图理解 INT 10h 13h 19 它用 BIOS 中断 10 和 13h 写入字符串 我找到了下面有关放入不同寄存器的不同标志的信息 我仍然不明白的一件事是 BL 中应该包含什么 如果我只是想用这个函数编写一个字符串 BL 中应
  • WCF 命名管道 IPC

    这周我一直在努力加快了解命名管道 我试图用它们解决的任务是我有一个现有的 Windows 服务 它充当设备驱动程序 将数据从外部设备传输到数据库中 现在我必须修改此服务并添加一个可选的用户前端 在同一台机器上 使用 IPC 形式 该前端可以
  • Python 命令行界面中的 Tab 补全 - 如何捕获 Tab 事件

    我正在用 Python 编写一个小 CLI 作为 Mercurial 的扩展 并且希望支持制表符补全 具体来说 我想在提示符中捕获选项卡并显示匹配选项的列表 就像 bash 一样 示例 输入部分名称 ext TAB extensions e
  • 在 Eclipse 中更改安全存储目录 - Windows 上的 user.home 路径问题

    我在 Eclipse 中保存密码时遇到问题 我的密码都没有被 记住 并且我发现 Eclipse 尝试将它们保存在我的 Windows 帐户无权访问的文件夹中 它尝试保存到 D Users Administrator eclipse org
  • 如何获取cardView item在recyclerView中的位置?

    我为回收器创建了一个适配器类 用于在回收器视图中填充卡片视图布局 它工作正常 但是当我单击 recyclerview 中的 cardView 项目时 我需要获取该 cardview 项目的位置 基于此我需要编写一个 Intent 活动 以及