RecyclerView 中的单选

2024-04-30

我知道没有默认的选择方法RecyclerView类,但我尝试过以下方式:

public void onBindViewHolder(ViewHolder holder, final int position) {
    holder.mTextView.setText(fonts.get(position).getName());
    holder.checkBox.setChecked(fonts.get(position).isSelected());

    holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(isChecked) {
                for (int i = 0; i < fonts.size(); i++) {
                    fonts.get(i).setSelected(false);
                }
                fonts.get(position).setSelected(isChecked);
            }
        }
    });
}

在尝试这段代码时,我得到了预期的输出,但不完全。

我将用图像来解释这一点。

默认情况下,第一项是从我的适配器中选择的。

然后我选择第二个,然后第三个,然后第四个,最后第五个。

这里只应选择第 5 个,但所有五个都将被选中。

如果我将列表滚动到底部并再次滚动到顶部,我就会得到我所期望的结果。

我怎样才能克服这个问题?有时,如果我非常快地滚动列表,则会选择其他一些项目。我也该如何克服这个问题?

当我尝试使用时notifyDataSetChanged() after fonts.get(position).setSelected(isChecked);,我得到以下异常:

java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
        at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:1462)
        at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:2982)
        at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:7493)
        at android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:4338)
        at com.app.myapp.screens.RecycleAdapter.onRowSelect(RecycleAdapter.java:111)

该问题的解决方案:

public class yourRecyclerViewAdapter extends RecyclerView.Adapter<yourRecyclerViewAdapter.yourViewHolder> {

    private static CheckBox lastChecked = null;
    private static int lastCheckedPos = 0;


    public void onBindViewHolder(ViewHolder holder, final int position) {
    
        holder.mTextView.setText(fonts.get(position).getName());
        holder.checkBox.setChecked(fonts.get(position).isSelected());
        holder.checkBox.setTag(new Integer(position));

        //for default check in first item
        if(position == 0 && fonts.get(0).isSelected() && holder.checkBox.isChecked())
        {
           lastChecked = holder.checkBox;
           lastCheckedPos = 0;
        }
           
        holder.checkBox.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {
               CheckBox cb = (CheckBox)v;
               int clickedPos = ((Integer)cb.getTag()).intValue(); 

               if(cb.isChecked())
               {
                  if(lastChecked != null)
                  {
                      lastChecked.setChecked(false);
                      fonts.get(lastCheckedPos).setSelected(false);
                  }                       
                 
                  lastChecked = cb;
                  lastCheckedPos = clickedPos;
              }
              else
                 lastChecked = null;

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

RecyclerView 中的单选 的相关文章

随机推荐

  • 递归和迭代的速度性能 – 为什么它们对于不同的“小”数都以相同的速度运行?

    我正在尝试优化我拥有的代码 为了做到这一点 我编写了这段代码来查看递归与迭代的效果 该代码 计数 到 10 的 n 次方 public Form1 InitializeComponent Stopwatch sw new Stopwatch
  • 设置 datetime-local 的默认时间值

    我使用这个 html 标签作为日期时间选择器
  • Cocoa 自动布局约束 - 以编程方式填充可变数量的视图

    我希望能够向超级视图添加新视图 但使它们彼此之间保持恒定的垂直距离 为此 我尝试以编程方式为每个视图设置约束 但我不知道如何做到这一点 问题是我事先不知道视图的数量或相对位置 有没有一种方法可以以编程方式为每个视图设置约束 以便无论它们相邻
  • 将 geom_path 和 geom_text 添加到同一 ggplot 会在 r 中生成错误

    我正在同一个 ggplot 中绘制 geom path 对象和 geom text 对象 但遇到以下问题 load the data frames df1 lt data frame x c 32 42 52 y c 15 20 25 gr
  • 在 C# 中的 RESTfull/HTTP 请求中添加标头和发布数据

    我在 C 中发送 POST 请求时遇到问题 似乎我误解了一些 HTTP 基础知识 所以基本上我正在实施 RESTfull 服务client 其工作原理如下 使用用户名 密码发出 POST 请求并获取令牌 在发出其他 GET POST PUT
  • RemoteViews 支持的方法

    我正在尝试将值转发到 Android RemoteView 某些值可以通过使用反射的 set 方法转发 例如背景颜色的工作原理 rv setInt R id viewId setBackgroundColor 0xffff0000 尽管该机
  • 如何在 JavaScript 中将随机对象文本插入到 DOM 中?

    我正在为表单输入字段制作自定义类包装器 这些字段内部包含 DOM 节点 并通过额外的功能方法进行增强 我的问题是是否有与 toString 类似的方法用于附加到 DOM 因为我想直接将对象插入到 DOM 而不是调用其他方法 换句话说 这是我
  • Django 可重用应用程序配置

    我有一些连接到数据库的 Django 中间件代码 我想将中间件变成可重用的应用程序 app 这样我就可以将其打包以分发到许多其他项目中 而无需复制和粘贴 我不明白可重用应用程序应该在哪里配置自身 由于它是用于重新分发的 所以我无法自己编写中
  • Python:从自定义域发送电子邮件

    我正在尝试从 Python 中的自定义域发送电子邮件 我已经弄清楚如何使用 smtplib 从其他域 例如 gmail com 发送电子邮件 示例代码 https stackoverflow com questions 57842922 c
  • 我们可以从 MFCC 系数中恢复音频吗?

    可以从 MFCC 系数中获取音频信号吗 另外 MFCC 系数是否有一个值范围 如果有的话 是什么 如果没有 如何将其归一化在 0 到 1 之间 我尝试使用以下 MATLAB 代码 http labrosa ee columbia edu m
  • 如何在代码中使用毕加索设置背景图像

    我知道毕加索将图像加载到 imageview 等中 但如何使用毕加索设置布局背景图像 My code public class MainActivity extends ActionBarActivity Override protecte
  • 在 dplyr::filter 中传递字符串作为变量名

    我使用 mtcars 数据集来说明我的问题 例如 我想将数据子集到 4 缸汽车 我可以这样做 mtcars gt filter cyl 4 在我的工作中 我需要传递一个字符串变量作为我的列名 例如 var lt cyl mtcars gt
  • 在 C# 中将字符串转换为类型[重复]

    这个问题在这里已经有答案了 如果我收到一个包含类名称的字符串 并且我想将该字符串转换为真实类型 字符串中的类型 我该怎么做 I tried Type GetType System Int32 例如 它似乎有效 但是当我尝试使用自己的对象时
  • 在 XCode 中静态链接 OpenSSL

    我正在尝试链接libssl a and libcrypto aXCode 命令行项目中的静态库 在 Link Binary With Libraries 下 我已在搜索路径中包含 Openssl 头文件 编译成功但执行失败dyld Libr
  • 从滑块输入数据以更改标记颜色

    感谢对此任务的任何帮助 我试图让这个破折号应用程序采用滑块输入值来通过函数更改变量 然后仅更改标记颜色变量 该代码是用 python 编写的 并使用了plotly dash 和plotly 以及pandas numpy 和mapbox 代码
  • 如何防止用户杀死C#应用程序[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果您使用 ESET Smart S
  • 我可以访问 TBits 内部位图吗?

    In particular i want to preset desired size fetch a bitmap from external source and then work with data in classy object
  • 使用 UDF 添加文件读取添加到 Hive 资源的文件

    我想知道如何读取使用添加的 Hive 资源ADD FILE来自乌德夫 例如 Hive gt add file users temp key jks Java中的UDF可以读取这个文件吗 在 Udf 中获取此文件的路径是什么 谢谢 大卫 一旦
  • JPEG 颜色在不同浏览器中呈现不一致

    我正在使用的徽标在不同浏览器中的呈现方式有所不同 具体图片可查here https pbs twimg com profile images 741262755236356096 BqpBjB8R jpg and on 这个推特页面 htt
  • RecyclerView 中的单选

    我知道没有默认的选择方法RecyclerView类 但我尝试过以下方式 public void onBindViewHolder ViewHolder holder final int position holder mTextView s