listview中Item记录点击状态的方法--(点击显示、隐藏的状态保存)

listView中的Item有时候会添加其他的内容,例如有一块儿隐藏的区域,点击后展开,再次点击则隐藏。这时如果Item超过一屏,那么直接在Adapter中的getView方法加入判空操作,即

if(convertView == null){
			convertView = new DownloadItem_CachedView(context);
		}

这时候,可能会出现混乱显示的情况。

解决办法,有三种。

1.  首先,各位想到的可能是直接把判空操作去掉,那么就不会复用,也就不会出现混乱了。这确实是一种方法,但是生成的View没有复用,那么会造成资源的浪费,而且有时候如果程序复杂,会出现各种异常的情况,这就是无意中造就的Bug,而且解的时候很难发现,本人就深深受过这种坑害。

2.
本地点击状态记录。传过去list的时候,加入一个字段表示是否已经展开,在原数据上加字段,该方法最好。举个例子:假如之前list传的是1-20的数字,每一个都显示在Item上,之前的 数据是list<Integer>,那么现在改成list<Map<Integer,Boolean>>,用来记录是否应该被展开,然后每次getView的时候判断是否该显示出来。

代码如下:

MainActivity.java

public class MainActivity extends Activity implements OnItemClickListener{
	private ListView lv;
	private Map<Integer,Boolean> ItemString;
	private ListViewAdapter myAdapter ;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		lv= (ListView) findViewById(R.id.listview);
		initItemNum();
		myAdapter = new ListViewAdapter(MainActivity.this,ItemString);
		lv.setAdapter(myAdapter);
		lv.setOnItemClickListener(this);
	}

	private void initItemNum() {
		// TODO Auto-generated method stub
		ItemString = new HashMap<Integer,Boolean>();
		for(int i =0;i<20;i++){
			ItemString.put(i,false);
		}

	}

	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, final int arg2, long arg3) {
				View view = arg1.findViewById(R.id.bottom);
				if(view.getVisibility() == View.VISIBLE){
					view.setVisibility(View.GONE);
					ItemString.put(arg2, false);
				}
				else{
					view.setVisibility(View.VISIBLE);
					ItemString.put(arg2, true);
				}
		Toast.makeText(MainActivity.this, "你点击的是:"+arg2, Toast.LENGTH_SHORT).show();

	}

}

listViewAdapter.java

public class ListViewAdapter extends BaseAdapter {
	private Context context;
	private Map<Integer,Boolean> ItemNumString;
	private LayoutInflater inflater;

	public ListViewAdapter(Context context,Map<Integer,Boolean> ItemNumString) {
		this.context = context;
		this.ItemNumString = ItemNumString;
		inflater = LayoutInflater.from(context);
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return ItemNumString.size();
	}

	@Override
	public Object getItem(int arg0) {
		// TODO Auto-generated method stub
		return ItemNumString.get(arg0);
	}

	@Override
	public long getItemId(int arg0) {
		// TODO Auto-generated method stub
		return arg0;
	}

	@Override
	public View getView(final int arg0, View arg1, ViewGroup arg2) {
		// TODO Auto-generated method stub
		if(arg1 == null){
			arg1 = inflater.inflate(R.layout.listview_item, null);
		}
		else{
			boolean flag = ItemNumString.get(arg0);
			if(flag){
				arg1.findViewById(R.id.bottom).setVisibility(View.VISIBLE);
			}
			<span style="background-color: rgb(51, 255, 51);">else{
				arg1.findViewById(R.id.bottom).setVisibility(View.GONE);
			}//重点,虽然默认为Gone,但复用的时候要加上,否则会混乱。</span>
		}

		return arg1;
	}
}

注意:可以将view想象成白板,每次重用需要将白板檫干净再用,否则在写了字的白板上再写字,那么就乱掉啦。

3.用全局map来记录点击状态。初始化Adapter的时候,初始化map,点击状态改变时,再次记录map中,getView的时候加入判断即可。这样做省事,但是浪费资源,而且有时候回有危险,就是刷新状态的时候,需要重新初始化map。

好了,就记录到这。

时间: 2024-08-29 16:57:17

listview中Item记录点击状态的方法--(点击显示、隐藏的状态保存)的相关文章

改变listview中item选中时文字的颜色

当listview的某个item选中时,默认有个选中的高亮显示,如果你要自定义选中时的高亮显示效果,可以在listview中设置属性 1 android:listSelector="@drawable/item_selector" 其中item_selector是在drawable目录下定义的一个xml文件,这种用于突出不同状态下显示效果的xml文件我们称之为selector: 1 2 3 4 5 6 7 <?xml version="1.0" encodin

【Android进阶】关于ListView中item与控件抢夺焦点的那些事

在开发中,listview可以说是我们使用最频繁的控件之一了,但是关于listview的各种问题也是很多.当我们使用自定义布局的Listview的时候,如果在item的布局文件里面存在Button或者是CheckBox等控件以及其子类控件的时候,经常会碰到各种控件的点击事件冲突的情况,那么我们如何来处理Listview中这种控件之间焦点冲突的情况呢? 我们以item存在一个Button控件为例 首先,加入我们不设置任何关于焦点的属性,比如focus等,代码如下 @Override public

listview中item的各种进入乱入效果实现

今天给大家带来的,是使用开源项目ListviewAnimation(此项目在Github上已经停止维护),来实现listview控件中,item的各种进入效果,包括左侧进入,右侧进入,下侧进入,右下角进入,放大进入.卡片样式等效果. 废话不多说,先上效果图. 卡片效果 底部进入 右侧进入 左侧进入 右下角进入 放大进入 因为这个代码确实没什么讲头,也没什么难度,我直接上传代码,大家自己看吧 点击下载源码 listview中item的各种进入乱入效果实现

奇葩问题:ListView中Item与Item中的Button不能单击问题

android中ListView是一个经常要用到的一个组件,用到该组件时经常会碰到ListView的Item和Item中的Button不能单击的问题. 本人在使用时同样也遇到过这样的情况,共有三种情况,总结如下: 情况一:焦点问题: 设置android:descendantFocusability="blocksDescendants"> 和android:focusable="false" 该情况比较常见,在网上都可以搜索到相关的解决办法,不在这过多的介绍,

android listview中item通过viewpager实现

android listview中item通过viewpager实现 android listview中item通过viewpager实现,每一个item都支持viewpager实现图片切换功能.本项目主要介绍多个viewpager加载图片和listview 上下滑动不卡顿问题.本项目由作者Flyco分享的分享地址:https://github.com/H07000223/FlycoBanner_Master.本项目找对应id封装一个ViewFindUtils类,通过如下代码找id    /**

MySql状态查看方法 MySql如何查看连接数和状态?

如果是root帐号,你能看到所有用户的当前连接.如果是其它普通帐号,只能看到自己占用的连接 怎么进入mysql命令行呢? mysql的安装目录下面有个bin目录,先用命令行进入该目录,然后用 mysql -uroot -p123456 来登录(注意:用户名和密码不用包含“”) 命令: show processlist; 如果是root帐号,你能看到所有用户的当前连接.如果是其它普通帐号,只能看到自己占用的连接. show processlist;只列出前100条,如果想全列出请使用show fu

[ jquery 效果 slideDown([speed,[easing],[fn]]) slideUp([speed,[easing],[fn]]) ] 此方法用于滑动显示隐藏的被选元素:动画效果只调整元素的高度,可以使匹配的元素以“滑动”的方式显示出来。在jQuery 1.3中,上下的padding和margin也会被有动画,效果更流畅

此方法用于滑动显示隐藏的被选元素:动画效果只调整元素的高度,可以使匹配的元素以“滑动”的方式显示出来.在jQuery 1.3中,上下的padding和margin也会被有动画,效果更流畅 实例: <!DOCTYPE html><html lang='zh-cn'> <head> <title>Insert you title</title> <meta http-equiv='description' content='this is my

解决ListView中Item的子控件与Item点击事件冲突

经常会碰到在ListView中点击其中一个Item,会一并触发其子控件的点击事件,例如Item中的Button.ImageButton等,导致了点击Item中Button以外区域也会触发Button点击事件.在网上找了相关方法,这里记录下,亲测可行.. 1.在Item的xml文件根元素中添加属性:android:descendantFocusability="blocksDescendants" 2.在冲突的子控件中添加属性:android:focusable="false&

Android学习之解决ListView中item点击事件和item中Button点击事件冲突问题

在ListView中添加Button后,如果只是单纯的加入而不加限制的话,ListView的onClick点击事件没有响应,因为Button获取了item的焦点,想要两者都可点击,需要加上如下限制: 在ListView的适配器中的布局文件中添加: (1)在布局文件的根元素上中添加属性android:descendantFocusability="blocksDescendants" (2)在Button中添加属性android:focusable="false"和a