关于android ListView的默认选择操作

在android开发中,ListView应该说是最常用的组件之一。这篇文章不对它的基本应用做讲解,需要了解相关内容的同行,敬请自行问度娘。

实际中,ListView初始化后,要进行一些默认操作,比如,我有个布局是显示部门与下属人员,要求加载完部门列表后,在右边显示第一个部门的下属人员,同时标识当前选中部门(红色符号)。(如下图)

从度娘可以看出来,有这个类似需求的同行在不少数,但是,要么是把解决办法笼统地带过,要么是很复杂的分析和解决方法。

对于大部分人来说,其实直接给出解决办法,是更好的答案。下面,我就把我的解决办法分享一下,如果有更好的,希望大家也能分享给我。

我在android方面也是新手,如有不当的地方,还大家望指教。

--------------------------------------------------------------

1.新建一个adapter,目的是重写getView方法(这个是关键)。

public class DefaultSelectedAdapter extends SimpleAdapter {
	private DefalutSelectedHandler handler = null;//定义一个默认选中的处理接口

	public DefaultSelectedAdapter(Context context,
			List<? extends Map<String, ?>> data, int resource, String[] from,
			int[] to, DefalutSelectedHandler toSelect) {
		super(context, data, resource, from, to);
		this.handler = toSelect;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		View view = super.getView(position, convertView, parent);
		//在返回view之前,调用选中处理接口方法;这里不对position==0进行判定,是为了适应更多的,如默认选中最后一个等
		handler.doSelected(position, view, parent);
		return view;
	}

	public interface DefalutSelectedHandler{
		void doSelected(int position, View view, ViewGroup parent);//在这个方法中定义需要的默认操作
	}
}

2.在ListView的生成如下:

final ListView listOrg = (ListView) viewSelect.findViewById(R.id.listOrg);//部门列表
final int listSize = listOrgData.size();//部门列表数据
DefaultSelectedAdapter adapter = new DefaultSelectedAdapter(context_, listOrgData,
		R.layout.org_list_item,
		new String[] { "relateName", "relateId"},
		new int[] { R.id.relateName, R.id.relateId},
		new DefaultSelectedAdapter.DefalutSelectedHandler() {//默认选中的处理接口的实现
			boolean initFlag = false;//用于标识处理接口是否已经成功执行过一次
			@Override
			public void doSelected(int position, View view, ViewGroup parent) {
				if(position==0 && !initFlag){//判断是否是第一项,并且处理接口未完成过
					view.findViewById(R.id.itemIcon).setVisibility(View.VISIBLE);//设定该项前面的符号可见,表示当前选中。
					if(parent!=null){
						int size_ = ((ListView)parent).getChildCount();
						//检查当前列表的个数,与数据的个数是否相等,即ListView已经初步加载完成
						if(size_>0 && listSize==size_){//至此,可以判定该处理接口已经成功执行过一次
							initFlag = true;
						}
					}
				}
			}
		});

listOrg.setAdapter(adapter);
listOrg.setOnItemClickListener(new ListView.OnItemClickListener() {
	boolean firstClick = true;//标识第一次点击
	@Override
	public void onItemClick(AdapterView<?> adapterView, View item, final int position, long row) {
		if(position!=0 && firstClick){//第一次点击时,由于之前没有设定ListView的tag,所以这里强制隐藏第一项的选中符号
			firstClick = false;
			listOrg.getChildAt(0).findViewById(R.id.itemIcon).setVisibility(View.GONE);
		}
		Object tag = adapterView.getTag();
		if(tag!=null){
			View item0 = (View) tag;
			item0.findViewById(R.id.itemIcon).setVisibility(View.GONE);//取消当前项的选择状态
		}

		/*
		*下面的performItemClick方法并未能使得这句话生效。
		*从开发中debug信息来看,我个人觉得,应该是这句的执行被ListView的getView方法覆盖了(getView会被多次调用)
		*/
		item.findViewById(R.id.itemIcon).setVisibility(View.VISIBLE);

		adapterView.setTag(item);//设定该ListView的tag,便于点击其它项时,取消当前项的选择状态
		//下面是我的业务处理
		String relateId = ((TextView) item.findViewById(R.id.relateId)).getText().toString();
		String relateName = ((TextView) item.findViewById(R.id.relateName)).getText().toString();
		HashMap<String, String> map = new HashMap<String, String>();
		map.put("relateName", relateName);
		map.put("relateId", relateId);
		renderUserList(viewSelect, map);
	}
});

AlertDialog.Builder builder = new AlertDialog.Builder(context_);
final AlertDialog dialogSelect = builder.setCancelable(true)
		.setView(viewSelect).setTitle("请选择接收人员").create();

dialogSelect.show();
if(curOrg!=null){
	//模拟点击第一项,用于加载数据
	listOrg.performItemClick(
			adapter.getView(0, null, null),
			0, adapter.getItemId(0));
}

上面两步,就是实现这个功能的全部代码。

其核心就是,在getView中调用你的默认选中项的处理方法,只是加入了比较多的判定,防止列表有变化时反复调用getView导致doSelected也被反复执行。

时间: 2024-10-09 20:02:35

关于android ListView的默认选择操作的相关文章

android listview级联三菜单选择地区,本地数据库sqlite级联地区,item选中不变色

前言:因为找了N多网上的资源都没有好的解决方案,别人都是只给思路没给具体源码,真TMD纠结,干嘛求别人,自己动手才是真,最痛恨那些所谓大牛的作风,给了点点代码就让别人去想,你让我们这种小白情何于堪!!!!!!此例是基于listview来实现本地sqlite实现的! 二话不说,程序猿求的是有图有真相有源码!大家下载后有什么问题可以找到本人:QQ508181017 核心代码如下 1.数据库操作类 package com.icq.demo.db; import java.util.ArrayList;

android listview综合使用示例_结合数据库操作和listitem单击长按等事件处理

本示例说明: 1.自定义listview条目样式,自定义listview显示列数的多少,灵活与数据库中字段绑定. 2.实现对DB的增删改查,并且操作后listview自动刷新. 3.响应用户操作点击事件,示例中展示单击时取出主键Id和其他内容. 4.响应用户操作长按事件,示例中展示长按时根据主键Id来编辑和删除数据. 5.表现层与数据处理层分开,不依赖于cursor(使用cursor不易表现和业务分离),支持接口编程. 6.使用数据库处理框架AHibernate灵活操作sqlite数据库,详见:

Android ListView 长按如何获取item的主键并操作对应数据库元组

============问题描述============ 我做的是一个租房管理系统,大概是现在在对房子操作这个界面,我现在是要长按listView中的某一个Item,要求实现修改和删除功能. This is my house_setting.xml document <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.andr

android listview综合使用演示样例_结合数据库操作和listitem单击长按等事件处理

本演示样例说明: 1.自己定义listview条目样式,自己定义listview显示列数的多少,灵活与数据库中字段绑定. 2.实现对DB的增删改查,而且操作后listview自己主动刷新. 3.响应用户操作点击事件,演示样例中展示单击时取出主键Id和其它内容. 4.响应用户操作长按事件,演示样例中展示长按时依据主键Id来编辑和删除数据. 5.表现层与数据处理层分开,不依赖于cursor(使用cursor不易表现和业务分离),支持接口编程. 6.使用数据库处理框架AHibernate灵活操作sql

Android listview与adapter用法

listview与adapter用法 博客分类: android 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView就是实现这个功能的.第二点也不难做到,在后面的学习中读者会发现,这非常简单. 一个ListView的创建需要3个元素. (1)ListView中的每一列的View. (2)填入View的数据或者图片等. (3)连接数据与ListView的适配器. 也就是说,要使用ListView,首先要了解什么是适配器

Android开发 打开文件 选择文件对话框

原文地址:http://blog.csdn.net/trbbadboy/article/details/7899424; 因项目需要打开文件,因此做了一个打开文件的对话框,现在把这部分的代码共享出来了. 首先是一个回调接口,该接口在文件选择完毕的通知调用者进行如果何种操作.文件接口声明,如下: [java] view plaincopyprint? // filename: CallbackBundle.java package com.example.openfiledemo; import 

Android ListView复杂列表优化实践

原文:Android ListView复杂列表优化实践 很多社交App都不免会涉及到复杂的列表元素实现,一个列表上面可能大量的图片,不定长的评论列表,给手机端的程序员带来了不少的挑战.本文就是在实现复杂的列表滑动的情况下,利用已知的优化方法指导下的一次优化实践,旨在提升ListView的滑动流畅度,为用户带来良好的体验. 1:设计稿: 这是列表中可能出现的ItemView,有两种,但是又有许多相同的地方,比如一样有点赞的图片,评论等...其中,评论和点赞的数量是可变的. 2:使用一般布局带来的问

Android ListView分页加载(服务端+android端)Demo

Android ListView分页加载功能 在实际开发中经常用到,是每个开发者必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了测试. 服务端使用MyEclipse,Android端使用Eclipse. 实现效果图: 服务端一共100条数据,共分四页,每页有25条数据. 源代码: 服务端: 需要导入图中这几个jar包. 在运行Android端代码前,需要开启服务端: 下面先给出服务端的代码: 类EmpDataSource: package com.android

Android listview的适配器以及各种监听、效率的提升

之前写过一篇关于listview的博客,现在感觉那篇博客关于listview认识不够全面.但有些方法还是可取,例如灵活的监听,写适配器.链接在这里android listview长按,单击各种事件捕捉.那个单击监听是一项项设置监听,效率也不好. 不断工作的过程,也是不断总结过程.现在对于listview有了更透彻的理解,所以重新写了一个实践demo.这个demo有涉及到listview的数据源,布局,适配器以及各种监听.效率的提升.现在对于这些理解,想写出一个通用的适配器,但发现还是有点困难,就