Android常用控件之ListView(二)

原创 2016年05月30日 14:29:29

之前介绍的ListView只能显示文本或者图片,但在实际的应用中显示的内容远不止这些内容,现在我们就来对ListView进行定制,让它显示更加丰富的内容。下面我们来实现显示checkbox选中项的效果。

定制ListView最常用的Adapter还是BaseAdapter,使用它可以实现很多自己定制的列表布局,首先创建一个MyAdapter类继承BaseAdapter,代码如下:

public class MyAdapter extends BaseAdapter{
	private LayoutInflater mInflater;
	private HashMap<Integer, View> map = new HashMap<Integer, View>();
	public List<Map<String, Object>> mdata;
	public List<Boolean> mChecked;
	
	public  MyAdapter(Context context) {
		// TODO Auto-generated constructor stub
		mInflater = LayoutInflater.from(context);
		init();
	}
	private void init() {
		// TODO Auto-generated method stub
		mdata = new ArrayList<Map<String,Object>>();
		for (int i = 0; i < 5; i++) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("title", i+1+"号控制端");
			mdata.add(map);
		}
		mChecked = new ArrayList<Boolean>();
		for (int i = 0; i < 5; i++) {
			mChecked.add(false);
		}
	}
	@Override
	public int getCount() {
		// 在此适配器中所代表的数据集中的条目数,默认为0数据不显示
		return mdata.size();
	}

	@Override
	public Object getItem(int position) {
		// 获取数据集中与指定索引对应的数据项
		return null;
	}

	@Override
	public long getItemId(int position) {
		// 取在列表中与指定索引对应的行id
		return 0;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		/*
                第一个参数position---该视图在适配器数据中的位置 
                第二个参数convertView---旧视图 
                第三个参数parent: 此视图最终会被附加到的父级视图
                */
		ViewHolder holder = null;
		if(convertView == null){
			holder = new ViewHolder();
			convertView = mInflater.inflate(R.layout.item, null);
			holder.title = (TextView) convertView.findViewById(R.id.textView1);
			holder.cBox = (CheckBox) convertView.findViewById(R.id.checkBox1);
			final int p = position;
			//map.put(position, view);
			holder.cBox.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					CheckBox cb = (CheckBox) v;
					mChecked.set(p, cb.isChecked());
				}
			});
			convertView.setTag(holder);
		}else{
			holder = (ViewHolder) convertView.getTag();
		}
		holder.cBox.setChecked(mChecked.get(position));
		holder.title.setText(mdata.get(position).get("title").toString());
		return convertView;
	}
	public final class ViewHolder{
		public TextView title;
		public CheckBox cBox;
	}
}

BaseAdapter是继承自接口类Adapter,所以继承BaseAdapter要重写getCount(),getItem(),getItemId(),getView(),其中重要的是getView(),这个方法在每个子项被滚动到屏幕内的时候会被调用,方法中的convertView参数,这个参数用于将之前加载好的布局文件进行缓存,以便之后可以进行调用,提高运行效率,当convertView为空创建convertView对象,使用LayoutInflater去加载子项的布局文件,如果不为空就直接对convertView进行重用。其中还用用到了ViewHolder类,用于对控件进行缓存,当convertView为空的时候则创建ViewHolder对象,然后调用findViewById()来获取控件的实例,再调用convertView的setTag()方法,将ViewHolder对象存储在View中。当convertView不为空的时候则调用View的getTag(),把ViewHolder重新取出。在这里还对checkbox设置了点击事件,并记录该子项中的checkbox的状态。

在MainActivity中加载这个适配器,代码如下:

public class MainActivity extends Activity {
	private ListView lv;
	private Button btn;
	private MyAdapter myAdapter;
	List<Integer> listItemID = new ArrayList<Integer>();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		myAdapter = new MyAdapter(this);
		lv = (ListView) findViewById(R.id.listView1);
		btn = (Button) findViewById(R.id.btn);
		lv.setAdapter(myAdapter);
		btn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				listItemID.clear();
				for (int i = 0; i < myAdapter.mdata.size(); i++) {
					if(myAdapter.mChecked.get(i)){
						listItemID.add(i);
					}
				}
				if (listItemID.size() == 0) {
					AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this);
					builder1.setMessage("没有选中任何记录");
					builder1.show();
				}else{
					StringBuilder sb = new StringBuilder();
					for (int i = 0; i < listItemID.size(); i++) {
						sb.append("ItemId="+listItemID.get(i)+ ".");
					}
					Builder builder2 = new AlertDialog.Builder(MainActivity.this);
					builder2.setMessage(sb.toString());
					builder2.show();
				}
			}
		});
	}

}


效果如图:


版权声明:本文为博主原创文章,未经博主允许不得转载。

listview与其他控件的布局问题

(一)在LinearLayout中定义一个listview和button: 若button在上,listview在下:
  • edward_leo
  • edward_leo
  • 2016年04月25日 20:00
  • 648

如何实现Fragment中控件动态控制ListView子控件属性

在写这篇博客之前被这个问题折腾了一两天,怎么都弄不好。一开始也看了几篇ListView显示错乱的文章,在此把写得比较好几篇连接分享至此:http://blog.csdn.net/s003603u/ar...
  • u012864297
  • u012864297
  • 2016年12月20日 15:43
  • 548

Android UI设计——ListView控件和自定义Adapter(四)

自定义Adapter   这个是ListView中使用最多的一个Adapter适配器,因为我们可以根据自己的意愿去创建数据和数据的布局样式。使用方式灵活,下面我们来学习一下自定义Adapter的具体步...
  • To_be_Designer
  • To_be_Designer
  • 2015年08月25日 20:35
  • 6430

Android基础之自定义控件、布局以及ListView控件

唉,我他么的今早上一睁眼11点多了,也不知道谁大晚上的不睡觉老师想我,害的我老是失眠,哈哈,自恋一下。今天下雪了,2016年的第一场雪,不过起来之后 扫雪还真是累死我了,不过干点活之后,学起来更带劲了...
  • BeMoreQuiet
  • BeMoreQuiet
  • 2016年01月22日 23:47
  • 634

【Android基础】listview控件的使用(4)-----自定义布局的listview的使用

前面我介绍了listview控件的不同用法,但是这些用法在实际的开发项目中是不足以满足需求的,因为前面的几种用法只能简单的显示文本信息,而且布局都比较单一,很难做出复杂的结果,在实际的开发项目中,90...
  • bz419927089
  • bz419927089
  • 2014年02月22日 21:42
  • 5504

手机助手(四):复杂的ListView + 自定义控件

简介 分类+热门。分类涉及的知识点:复杂的listview,热门涉及的知识点:自定义控件。 效果图分类 ClassifyFrag 复杂的listview的adapter比一般的多了2个方法,而...
  • ss1168805219
  • ss1168805219
  • 2016年10月29日 22:18
  • 594

Android listview子控件的的点击事件

1.先看图,是否是你想要的 2.布局文件 xml version="1.0" encoding="utf-8"?>...
  • zcf520android
  • zcf520android
  • 2016年05月21日 17:26
  • 5619

安卓 Activity中获取ListView子View中控件

对于安卓中的ListView控件,相信大家都是又恨又爱。
  • w2180z
  • w2180z
  • 2014年09月09日 09:42
  • 7066

【学习】ListView中控制子控件的隐藏和显示

额。直接上属性。 TextView view; view.setVisibility(View.VISIBLE); 这里有三个属性。分别是VISIBLE可见。INVISIBLE隐藏。还有一个...
  • u013843773
  • u013843773
  • 2014年03月05日 17:31
  • 2407

Android基础控件——ListView实现时间轴效果

ListView实现时间轴效果 实现思路: 该View是通过ListView实现的,通过实体两个字段内容content和时间time来展示每个ListItem 时...
  • K_Men
  • K_Men
  • 2016年11月21日 13:41
  • 801
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android常用控件之ListView(二)
举报原因:
原因补充:

(最多只允许输入30个字)