1、相信刚开始使用ListView都接触到过,就是比如ListView的item有一个Button或一个CheckBox,你明明点击按键改变了他的背景图片或者颜色,又或者勾选了CheckBox,但是你一滑动,发现下面你没操作的item也跟着改变了,然后你再滑动回去,结果原来item上面的操作又变没了,这就是ListView中item复用时产生的问题。
2、我的解决办法是直接继承使用系统的ListActivity类,说明下,继承自ListActivity类将自动创建一个ListView,并公开一个ListAdapter属性以提供要通过适配器显示的行视图。内置适配器采用视图资源ID作为参考。你可以使用内置资源(如 Android.Resource.Layout 中的资源),这样就无需编写你自己的资源。而且继承使用ListActivity类后,滑动时复用控件所产生的混乱问题也解决了。(注:我要的功能只是选择ListView的item,然后,返回对应item值就可以 ,如果你的布局要复杂,请参考这篇博文:https://blog.csdn.net/verzqli/article/details/50298999,很详细地介绍怎么解决复用时产生混乱的问题。)
3、利用ListActivity类可以解决滑动时产生混乱的问题,但是我在选择item返回行视图的时候,又遇到了一个新问题,ListView.GetChildAt(position)返回null(position为混动屏幕后,选择item所在的位置),这个问题应该也是ListView复用时产生的,如下图:
4、这个问题我的解决办法是:重写ListActivity的OnListItemClick()方法,该方法的原型是:protected override void OnListItemClick(ListView l, View v, int position, long id),第二个参数v 应该就是单击item返回的行视图view,有了这个view 就好办了,可以得到想要的资源ID的值了。
///实现选择复选标记后记录所选的项, 部分代码:
//定义lstselect 保存所选item
list<string> lstselect = new list<string>();
重写ListActivity的OnListItemClick()方法
protected override void OnListItemClick(ListView l, View v, int position, long id)
{
bool IsChecked = l.IsItemChecked(position);
//View vv= ListView.GetChildAt(position);
//vv.FindViewById<TextView>(Android.Resource.Id.Text1);
var Text1 =v.FindViewById<TextView>(Android.Resource.Id.Text1);
if (IsChecked)
{
lstselect.Add(Text1.Text);
}
else
{
lstselect.Remove(Text1.Text);
}
base.OnListItemClick(l, v, position, id);
}
=======================================
参考博文:https://blog.csdn.net/verzqli/article/details/50298999
小弟刚学Android开发不久,对Android开发知识和架构不太了解,如果对这篇文章中的观点有不同看法的,欢迎留言,谢谢!