ListView、RecyclerView CheckBox 单选实现,以及RecyclerView异步加载网络图片

Android开发实战:基于Eclipse的完整项目构建与核心技能解析 Android应用开发作为移动生态的基石,其核心在于理解四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的协作机制与项目架构设计。从原理层面看,Android系统通过组件化模型管理应用生命周期,而开发者需掌握UI布局、事件处理、数据持久化及网络通信等关键技术模块。这些技能的价值在于能够构建稳定、高效且可维护的移动应用,满足从个人工具到商业平台等多种应用场景的需求。本文以经典的Eclipse开发环境为切入点,通过一个完整的“博学谷”项目实战,系统 阅读详情


一般来讲,实现单选的方法都是使用RadioGroup,但是有时候,数据很多的时候,往往会很麻烦,要写很多RadioButton,这就蛋疼了。所以就想着用ListView或RecyclerView + CheckBox来处理,应该是个不错的想法。

那么问题就来了,RecyclerView里面怎么才能实现单选呢。我们都知道,CheckBox是可以独立的,多选的,这就纠结了。于是就想着,要是每一次选择,都将上次选择的取消掉,就可以了。然后就索性,每次选择之前,先循环遍历,将所有的项目设置为false,然后在设置自己要选中的项目,这样应该是个不错的想法,下面我们就来看看怎么实现的吧,简答粗暴的方法----上代码:



/**
 * Created by zhong on 2017/1/10.
 */

public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.ViewHolder> {

    private Context mContext;
    private LayoutInflater mInflater;
    private List<BusListBean> mList;
    private RecyclerView mRecyclerView;
    private int mSelectedPos = 0;//实现单选  变量保存当前选中的position


    public GalleryAdapter(Context context, List<BusListBean> datats, RecyclerView view) {
        mContext = context;
        mInflater = LayoutInflater.from(context);
        mList = datats;
        mRecyclerView = view;

        //设置数据集时,找到默认选中的position
        for (int a = 0; a < mList.size(); a++) {
            if (mList.get(a).isSelected()) {
                mSelectedPos = a;
            }
        }
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        private TextView mSeat;
        private TextView mLicence;
        private LinearLayout rootView;
        private CheckBox cb_bus_change;
        private RoundedImageView mImageView;
        private RoundedImageView mImageView1;

        public ViewHolder(View arg0) {
            super(arg0);
            rootView = (LinearLayout) arg0.findViewById(R.id.rootView);
            cb_bus_change = (CheckBox) arg0.findViewById(R.id.cb_bus_change);
            mImageView = (RoundedImageView) arg0.findViewById(R.id.riv_outside);
            mImageView1 = (RoundedImageView) arg0.findViewById(R.id.imageView1);
            mSeat = (TextView) arg0.findViewById(R.id.seat);
            mLicence = (TextView) arg0.findViewById(R.id.licence);
        }
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }

    @Override
    public void onViewRecycled(ViewHolder holder) {
        super.onViewRecycled(holder);
    }

    /**
     * 创建ViewHolder
     */
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = mInflater.inflate(R.layout.activity_order_change_bus_item,
                viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(view);

        return viewHolder;
    }

    /**
     * 设置值
     */
    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int i) {
//        final String new_bus_id = bean.getId();
        final BusListBean bean = mList.get(i);
        viewHolder.cb_bus_change.setChecked(bean.isSelected());

        viewHolder.rootView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //每次点击选择时,把看见的,看不见的的项目设置为非选择状态
                ViewHolder holder = (ViewHolder) mRecyclerView.findViewHolderForLayoutPosition(mSelectedPos);
                if (holder != null) {
                    holder.cb_bus_change.setChecked(false);
                } else {
                    notifyItemChanged(mSelectedPos);
                }
                mList.get(mSelectedPos).setSelected(false);//上次选中的条目,设置为false;
                //更新默认选中的position;
                mSelectedPos = i;
                //最后设置要选中的那项;
                mList.get(mSelectedPos).setSelected(true);
                viewHolder.cb_bus_change.setChecked(true);
            }
        });

        //下边是关于异步加载网络图片的方法,

//        setHttpImage(bean.getBus_pic());
        viewHolder.mImageView1.setImageDrawable(null);
        final String httpUrl = bean.getBus_pic();
        viewHolder.mImageView1.setTag(httpUrl);

        //异步加载网络图片
        new AsyncTask() {
            @Override
            protected Object doInBackground(Object[] params) {
                try {
                    URL picUrl = new URL(httpUrl);
                    Bitmap bitmap = BitmapFactory.decodeStream(picUrl.openStream());
                    return bitmap;
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(Object o) {
                super.onPostExecute(o);
                //加载完毕后判断该imageView等待的图片url是不是加载完毕的这张
                //如果是则为imageView设置图片,否则说明imageView已经被重用到其他item
                if (httpUrl.equals(viewHolder.mImageView1.getTag())) {
                    viewHolder.mImageView1.setImageBitmap((Bitmap) o);
                }
            }
        }.execute();
    }
}


嘿,果然可以奥。哈哈哈

上面的代码包含异步加载网络图片的方法,很简单,自己看一下代码应该都能看懂。

ok,那就这样吧。

Recyclerview 单行选择----单项选择 立即下载

相关推荐

Android RecycleView使用(CheckBox全选、反选、单选)

主要为大家详细介绍了Android RecycleView使用,CheckBox全选、反选、单选效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Glide开源库结合RecyclerView实现加载图片

问题? 如何在RecyclerView上面动态图片,同时这个图片的地址存储在Json字符串中的呢? 准备工作: 我们需要在用到两个jar包 其中glide,是加载图片的框架,gson则是用来解析json数据和将javabean转换为json字符串的jar包。 开始撸代码 1 在主界面定义一个recyclerview的布局文件activity_main.xml<?xm

qq_25901775的博客 4707

26 硬件工程师笔面试高频考点真题解析——CAN总线

CAN总线是一种差分多主串行半双工总线,采用非破坏性位仲裁机制和五层硬件错误检测(位错误、填充错误、CRC校验、格式错误、应答错误),具有高可靠性和故障容错能力。关键设计包括两端120Ω终端电阻匹配阻抗、手拉手总线拓扑、显性/隐性电平优先级仲裁。常见故障分析指出多节点异常多因终端电阻错配/漏装、星型布线违规或总线过载;高速通讯失败常由阻抗失配或线缆过长导致信号反射。相比RS485,CAN支持多主架构、硬件自动仲裁和节点故障隔离,更适用于汽车、工业等高可靠场景。

XU157303764的博客 550

Android学习--Glide、RecyclerView加载网络图片

Glide是GitHub上一款开源的图片加载框架,即可以加载本地图片,也可以加载网络图片。使用方法也比较简单 最简单的使用: Glide.with(this) .load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png") .into(imageView); 具体用...

u010473556的博客 4559

Netty源码分析系列之writeAndFlush()下

write()只会将数据只是发送到了ChannelOutboundBuffer 缓冲区中,还没有被发送到操作系统的套接字中只有当调用了 flush()方法后,才会真正将数据发送到套接字中。那么 flush()方法的源码又是如何执行的呢?

天堂的博客 1573

解锁全志T113-i隐藏技能:用RISC-V核跑实时系统比STM32还稳?

本文深入探讨了全志T113-i SoC的异构架构潜力,重点解析如何利用其内置的玄铁C906 RISC-V核心独立运行实时系统。通过对比传统MCU与Linux方案,文章提供了从RISC-V核心启动、FreeRTOS移植到与Linux主核进行高效异构通信的完整实战指南,为工控等需要兼顾丰富应用与硬实时控制的场景提供了高集成度的单芯片解决方案。

ansible6ops的博客 495

RecyclerView加载图片

这是一个完整,然后说哪些有用 adapter = object : BAdapter<ActivityViewHolder, JSONObject>(R.layout.item_show_print_list, data) { var lruCache: LruCache<String, BitmapDrawable>? = null ...

sinat_40387150的博客 1891

40-基于STM32与LD3320的智能语音调光台灯开发全攻略(代码+硬件+调试心得)

本文详细介绍了基于STM32与LD3320的智能语音调光台灯开发全攻略,包括硬件设计、软件实现和调试心得。项目利用STM32单片机控制LD3320语音识别模块,实现语音控制开关和PWM调光功能,适合非接触式操作场景。文章还分享了硬件选型、PWM调光算法优化及常见问题解决方案,为开发者提供完整参考。

weixin_29163797的博客 325

RecyclerView中使用CheckBox勾选混乱问题解决以及单选功能的实现

一.RecyclerView + CheckBox勾选混乱问题解决 RecyclerView中使用CheckBox时因为RecyclerView布局会重用,所以在勾选时出现勾选混乱。如图 勾选 0号位和2号位 21 23也被勾选了。 此时适配器中的代码 @Override public void onBindViewHolder(ViewHolder holder, final int position) { holder.mTextView.setText(mList.get(positi..

u010227042的博客 925

Dify Rerank 模型配置全流程解析:从报错定位到代码实现

Dify Rerank 模型配置全流程解析:从报错定位到代码实现

engchina的专栏 4471

保姆级教程:用ROS2 Humble + Gazebo Classic 从零搭建一个能键盘控制的差分AGV模型

本文提供了一份详细的ROS2 Humble与Gazebo Classic教程,指导用户从零开始搭建一个键盘控制的差分AGV模型。内容涵盖环境配置、Xacro文件设计、Gazebo仿真集成以及键盘控制实现,特别针对常见问题提供解决方案,帮助开发者快速掌握ROS2机器人仿真技术。

weixin_30387423的博客 169

Android RecycleView 加载网络图片

1.初始化recycleview private NetworkImageAdapter adapter;//recyclerview 的适配器 private List<String> imagePathList;//网络图片对应的路径集合 /** * 初始化recyclerview * @param view */ private void initWidget(View...

chailongger的博客 2095

【2026年华为秋招(AI)-2月4日-第一题(100分)- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

本文摘要:本文包含20道选择题,涵盖机器学习、线性代数、Transformer架构、概率统计等多个领域。题目涉及正交矩阵性质、Transformer注意力机制、聚类距离度量、ReAct框架、Softmax函数、混淆矩阵计算、Flash-Attention优化、位置编码、期望计算、归一化方法、矩阵迭代法、矩阵秩、大模型架构、神经网络推理、泊松流性质、SVM核函数以及聚类算法等知识点。每道题均提供解析,帮助理解核心概念和解题思路。

m0_73659489的博客 126

Appium Inspector 2025.3.1:Android自动化测试元素定位新利器

移动应用自动化测试的核心在于精准、高效地定位UI元素。其原理是通过测试框架与设备UI层交互,识别并操作控件,从而实现模拟用户行为。这项技术的价值在于提升测试覆盖率、保证应用质量并加速迭代流程,广泛应用于金融、电商、社交等各类App的回归测试与兼容性验证。随着技术演进,独立、高效的工具链成为工程实践的关键。本文聚焦于Appium Inspector 2025.3.1这一独立元素检查器,它基于Web技术栈重构,解决了传统集成工具在响应速度和稳定性上的痛点,并通过与Appium Server解耦,提供了更灵活的连

weixin_33691700的博客 485

Unitree G1仿人机器人协同搬箱:从仿真搭建到多机协同部署完整指南

Unitree G1仿人机器人协同搬箱技术方案摘要 本文提供了一套完整的Unitree G1人形机器人协同搬箱解决方案,涵盖从仿真环境搭建到多机协同部署的全流程。核心内容包括: 双仿真环境配置:同时搭建Gazebo+ROS Noetic基础仿真环境与Isaac Gym+Mujoco高性能RL训练环境,支持Sim2Sim迁移验证 训练框架搭建:详细配置unitree_rl_gym框架,提供PPO算法定制化训练流程和参数优化方案 数据集应用:整合宇树开源真机数据集(UnifoLM-WBT-Dataset)~~~

huanghm88的专栏 472

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android Glide网络图片加载神器

今天我们的要说的是网络加载根据,Glide.在Android中加载图片对android系统来说非常重要, 因为系统给每一个app的内存都是有限的, 而一个app中最占用内存的就是图片, 但是又要保证能给用户一个良好,流畅的体验, 所以我们一般都是将从网络获取到图片先保存到内存,然后再保存到本地, 这样就解决了流畅的问题, 因为从内存中读取缓存速度是最快的,接下来是本地,而且都不耗费流量, 但是与此同

曲洋的博客 1306

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

RecyclerView用CheckBox实现单选

关键代码: // 记录选中的Item private int selectedPosition = -1; @Override public void onBindViewHolder(@NonNull final ItemViewHolder holder, final int position) { holder.mTV.setText(list.get(position).getName()); holder.mCB.setChecked(lis

weixin_40763897的博客 2751

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

RecyclerView实现单选的三种方式

今天给大家分享下RecyclerView实现单选的三种方式,这三种方式都需要一个标识位,mPosition 单选的话建议大家不要使用checkBox(android不同版本checkBox显示的不一样哦),使用一个ImageView代替是最理想的 在Adapter里面首先初始化我们的标识位 intmPosition=-1; 第一种方式就是刷新列表,使用notifyDataSetCha...

Welcome 3265

记录RecyclerView+CheckBox实现单选操作

Android中关于这个表单的操作中单选和多选操作比较多,尤其在列表中操作的这个状态值很绕脑子,还要考虑焦点冲突,滑动错乱。之前又做过购物车的多选,全选,反选;还做过考试系统的单选题和多选题除过这些常规的以外还有各种奇葩需求,多选可以参考我以前写的博客列表多选操作,今天我来记录一个电商app中选择优惠券的单选操作(一般很少让你同时使用多张优惠券) 具体代码如下,可以自行看注释 public ...

ITPlus的博客 1300

RecylerView配合ChekBox实现单选,解决了因为复用导致单选框混乱现象

1、大家经常遇到recylerView需要单选的情况吧,其实这个实现起来很简单,话不多说 先来看下效果。 2、好吧 大家如果觉得效果还算可以的话,就继续往下看吧。 思路: 首先,recylerview的item里面 有一个 checkBox,在点击的时候 将checkBox 设置为true,并将上一次设置为true的checkBox设置为false,达到我们单选的需求。(好吧,其

l13020227067的博客 684

Android之在RecyclerView列表中实现单选

包含一个TextView和一个右侧选中的图片ImageView√。单选、可取消选中、列表数据可更新(选择状态清空,可重新选择)activity内部自定义适配器TipListAdapter。selected_tip_list_item.xml文件。仅展示部分核心代码,请主要参考适配器的定义。RecyclerView列表单选。(mList为请求到的数据)

qq_46269365的博客 1250

Android RecyclerView、ListView实现单选列表的优雅之路.

一 概述: 这篇文章需求来源还是比较简单的,但做的优雅仍有值得挖掘的地方。 需求来源:一个类似饿了么这种电商优惠券的选择界面:其实就是 一个普通的列表,实现了单选功能,效果如图:(不要怪图渣了,我撸了四五遍,公司录出来的GIF就这么渣。。。) 常规方法:在Javabean里增加一个boolean isSelected字段,并在Adapter里根据这个字段的值设置“CheckBox...

weixin_30433075的博客 213

RecyclerView 低耦合单选、多选模块实现

需求很简单也很常见,比如有一个数据列表RecyclerView,需要用户去点击选择一个或多个数据。实现单选的时候往往简单下标记录了事,实现多选的时候就稍微复杂去处理集合和选中。随着项目选中需求增多,不同的地方有了不同的实现,难以维护。因此本文设计和实现了简单的选择模块去解决此类需求。不需要改动AdapterViewHolderItem,低耦合单选,可监听选择变化,手动设置选择位置,支持配置再次点击取消选择多选,支持全选,反选等支持数据变化后记录原选择本文实现了在。

1 888

【Android】 RecyclerView、ListView实现单选列表的优雅之路

我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了5、6年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。不断奔跑,你就知道学习的意义所在!

2401_84132381的博客 1124
上一篇: RecyclerView中,图片加载重用问题,异步加载图片
下一篇: Android中Fragment中onActivityResult不被调用的解决方案
觉守
博客等级 码龄12年 4粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值