[置顶]android ListView包含Checkbox滑动时状态改变
题外话:
Adapter中的GetView没有经过优化的代码:
<pre name="code" class="csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Java.Lang;
using DeBug = System.Diagnostics.Debug;
namespace DrawerLayout.Adapter
{public class News {public int Pv { get; set; }public string Title { get; set; }public News(string title,int Pv){this.Title = title;this.Pv = Pv;}}public class NewsAdapter : BaseAdapter{private List<News> data;private Context context;public override int Count{get{return data.Count;}}public NewsAdapter(List<News> data,Context context){this.data = data;this.context = context;}public override Java.Lang.Object GetItem(int position){return null;}public override long GetItemId(int position){return position;}private int count;public override View GetView(int position, View convertView, ViewGroup parent){convertView = LayoutInflater.From(context).Inflate(Resource.Layout.lv_test,parent,false);TextView title = convertView.FindViewById<TextView>(Resource.Id.tv_title);TextView pv = convertView.FindViewById<TextView>(Resource.Id.tv_pv);CheckBox chk = convertView.FindViewById<CheckBox>(Resource.Id.chk_test);pv.Text = data[position].Pv.ToString();title.Text = data[position].Title;DeBug.Write($"执行GetView第{position}次");//DeBug.Write直接在输出里面看到到底发生了什么DeBug.Write(dictChk[position]);return convertView;}}
}
Xamarin android中ListView中的CheckBox在滑动的时候失去状态的根本原因:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Java.Lang;
using DeBug = System.Diagnostics.Debug;
namespace DrawerLayout.Adapter
{public class News {public int Pv { get; set; }public string Title { get; set; }public News(string title,int Pv){this.Title = title;this.Pv = Pv;}}public class NewsAdapter : BaseAdapter{private List<News> data;private Context context;private Dictionary<int, bool> dictChk = new Dictionary<int, bool>();public override int Count{get{return data.Count;}}public NewsAdapter(List<News> data,Context context){this.data = data;this.context = context;for (int i = 0; i < data.Count; i++){dictChk.Add(i,false);}}public override Java.Lang.Object GetItem(int position){return null;}public override long GetItemId(int position){return position;}private int count;public override View GetView(int position, View convertView, ViewGroup parent){convertView = LayoutInflater.From(context).Inflate(Resource.Layout.lv_test,parent,false);TextView title = convertView.FindViewById<TextView>(Resource.Id.tv_title);TextView pv = convertView.FindViewById<TextView>(Resource.Id.tv_pv);CheckBox chk = convertView.FindViewById<CheckBox>(Resource.Id.chk_test);pv.Text = data[position].Pv.ToString();title.Text = data[position].Title;chk.Checked = dictChk[position];//每一个Checkbox是否选中是直接根据dicChk的key(position)获取是否选中chk.CheckedChange += (s, e) =>{dictChk[position] = e.IsChecked;//每一次单击CheckBox,dictChk都会保存单击哪一个(position)的状态};DeBug.Write($"执行GetView第{position}次");//DeBug.Write直接在输出里面看到到底发生了什么DeBug.Write(dictChk[position]);return convertView;}}
}
效果图:
这样肯定不行啊!!一般ListView中的控件都会加一个类 ViewHolder来优化啊.
public override View GetView(int position, View convertView, ViewGroup parent){ViewHolder holder = null;if (convertView == null){convertView = LayoutInflater.From(context).Inflate(Resource.Layout.lv_test, parent, false);holder = new ViewHolder();holder.tv_title = convertView.FindViewById<TextView>(Resource.Id.tv_title);holder.tv_pv = convertView.FindViewById<TextView>(Resource.Id.tv_pv);holder.chk_status = convertView.FindViewById<CheckBox>(Resource.Id.chk_test);convertView.Tag = holder;}else {holder = (ViewHolder)convertView.Tag;}holder.tv_pv.Text = data[position].Pv.ToString();holder.tv_title.Text = data[position].Title;DeBug.Write($"执行GetView第{position}次");DeBug.Write(dictChk[position]);return convertView;}
以上代码所出现的问题是在listview滑动的时候,比如你手机能够看到6项, 选中第一项之后,滑动之后第七项就选中了,再次反复滑动第1,7项一直都是选中的状态那么原因出在哪里呢?调试的时候我们会很容易看到发生的清空。原因我引用别人博客的一段话,个人觉得解释还是蛮清楚的:
public override View GetView(int position, View convertView, ViewGroup parent){ViewHolder holder = null;News item = data[position];if (convertView == null){convertView = LayoutInflater.From(context).Inflate(Resource.Layout.lv_test, parent, false);holder = new ViewHolder();holder.tv_title = convertView.FindViewById<TextView>(Resource.Id.tv_title);holder.tv_pv = convertView.FindViewById<TextView>(Resource.Id.tv_pv);holder.chk_status = convertView.FindViewById<CheckBox>(Resource.Id.chk_test);convertView.Tag = holder;}else{holder = (ViewHolder)convertView.Tag;}holder.chk_status.Tag = position;holder.tv_pv.Text = data[position].Pv.ToString();holder.tv_title.Text = data[position].Title;<span style="color:#FF0000;">holder.chk_status.Checked = dictChk[(int)holder.chk_status.Tag];</span>holder.chk_status.CheckedChange += (s, e) =>{DeBug.Write((int)holder.chk_status.Tag);<span style="color:#FF0000;">dictChk[(int)holder.chk_status.Tag] = e.IsChecked;</span>};DeBug.Write($"执行GetView第{position}次");DeBug.Write(dictChk[position]);return convertView;}
position参数的误区:
加上上面两行红色的代码就可以完全解决listView滑动时失去ChecxBox状态的bug了,刚开始学的时候不能理解这个bug是因为这个GetView中的position参数,当你刚学会用这个listview的时候你一定以为position不就是有多少条数据就多大吗?但是实际却是完全相反的,你手机能显示6条数据。position一直都是0-5,当你滑动到2-7的数据时,position还是0-5。还有CheckBox的状态也可以用用实体字段来保存.
Android中Tag是什么
既然不能position来做标识,那就用Tag。这样问题似乎简单多了,好像并没有想象中的复杂啊。简单点说,Tag的作用是和Id的作用是一样的,程序中调用对应的控件用(findViewById(R.tag.chk),findViewByTag(R.tag.chk))!不过和使用tag相比,使用Id进行查找!效率更快!但是在xamarin android中好像没有Tag这种查找控件的方式.
所以我们就要用Tag来保存这个每一个CheckBox的状态
<span style="color:#FF0000;">holder.chk_status.Checked = dictChk[(int)holder.chk_status.Tag];</span>
看到这里是不是觉得很简单啊!!!!嘻嘻。
转载于:https://www.cnblogs.com/zhangmumu/p/7374806.html
[置顶]android ListView包含Checkbox滑动时状态改变相关推荐
- android ListView包含Checkbox滑动时状态改变
题外话: 在xamarin android的开发中基本上所有人都会遇到这个小小的坎,的确有点麻烦,当时我也折腾了好一半天,如果你能看到这篇博客,说明你和我当初也是一样的焦灼,如果你想解决掉这个小小的坎 ...
- listview中有checkbox 滑动后状态改变
问题描述:listview中有checkbox组件 选中itemX后 滑动listview itemX滑出屏幕再滑回来 状态变成了未选中 经网上一篇博文的点拨(虽然他也不甚知其原因) http://b ...
- android ListView控件滑动时出现黑色背景问题解法方案
设置ListView属性android:cacheColorHint="#00000000" <ListViewandroid:id="@+id/orderDeta ...
- android listview标题置顶,Android仿QQ左滑删除置顶ListView操作
最近闲来无事,于是研究了一下qq的左滑删除效果,尝试着实现了一下,先上效果图: 大致思路原理: - 通过设置margin实现菜单的显示与隐藏 - 监听onTouchEvent,处理滑动事件 上代码 i ...
- android listview ontouchlistener,Android ListView监听滑动事件的方法(详解)
ListView的主要有两种滑动事件监听方法,OnTouchListener和OnScrollListener 1.OnTouchListener OnTouchListener方法来自View中的监 ...
- Android ListView中CheckBox选中状态失效的最佳解决方案
Android ListView中CheckBox选中状态失效: 在ListView中某一项滑到显示区外部的时候,重新划回来时其中的CheckBox的选中状态会重置,本文提出了一种解决方案,操作起来快 ...
- android标题栏渐变动画,Android 顶部标题栏随滑动时的渐变隐藏和渐变显示效果
各位早上好,话不多说,先上效果图: 注意顶部:首页textview的变化(显示和隐藏)! 首先分析下:ui状态,其是由recyclerview添加头部组成+recyclerview 头部添加和recy ...
- [置顶] Android自定义控件 芝麻信用分雷达图
[置顶] Android自定义控件 芝麻信用分雷达图 标签: android自定义雷达芝麻信用 2016-10-23 20:11 3548人阅读 评论(24) 收藏 举报 分类: 自定义控 ...
- android列表实现置顶,Android利用RecyclerView实现全选、置顶和拖拽功能示例
Android利用RecyclerView实现全选.置顶和拖拽功能示例 发布时间:2020-08-23 16:26:42 来源:脚本之家 阅读:159 作者:爱开发 前言 今天给大家分享是如何在Rec ...
最新文章
- 启动ServerManager
- 大话设计模式—中介者模式
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 12丨销售分析 III【难度简单】
- C#(asp.net)实现目录(无扩展名)重写
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)签到题K Co-prime Permutation,L Let‘s Play Curling
- 【资料】Shell脚本学习指南
- python绘图 ——蜡笔小新
- 第二章 进程的描述与控制【操作系统】
- 微信的JS接口安全域名设置+tomcat服务器
- 微信小程序之本地网络服务器配置
- SDR对比,以及工作原理介绍
- **Java程序员装机必备软件**
- NMS非极大值抑制的原理
- *.brd 文件 是用什么软件打开的?
- 白云苍狗看复鹿 冥鸿相助见神龙
- ETC营销数据统计及展示
- 【转】Voip 知识
- 软件测试面试题及答案,不给答案的面试题都是耍流氓
- Arm汇编寻址方式工作模式
- 简述计算机网络测试和故障诊断的发展趋势,网络测试和故障诊断