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();
				}
			}
		});
	}

}


效果如图:


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

相关文章推荐

Android常用控件(二)【ProgressBar、ListView】

一、ProgressBar的使用方法    ProgressBar是一种可视化的操作进度条。告诉用户当前操作的执行进度。横条进度条可以有两种现实,一种深色的,一种浅色的,进度可以分别控制。 示...

Android(六) 常用控件(二)单选框,toast,checkbox,progressbar,listview

本文导读: 一共介绍了四个控件: 1.RadioGroup,RadioButton 单选框 2.Toast 3.CheckBox 多选框 4.进度条 5.ListV...

Android开发七:常用控件3--ListView(二)

接着上一节,上一节讲的是通过ArrayAdapter、SimpleAdapter给ListView绑定数据,它们的缺点就是在每一个item里面如果有按钮控件的话,点击是不管用的。这个时候我们就要用Ba...

Android常用控件 可折叠的ListView

  • 2017年11月15日 17:22
  • 119KB
  • 下载

写给初学者16_android_常用控件_ListView

安卓16_常用的AdapterView-ListView基本的控件能够帮助我们完成简单的界面搭建,列表性的控件需要特殊类型的控件,比如这里的ListView。这是非常常用的一种控件。基本类图布局使用 ...
  • Mofeel_
  • Mofeel_
  • 2017年04月13日 16:27
  • 147

Android常用控件--ListView的简单使用

ListView简单编写.如有错误,请指正,定虚心听取

android常用控件(三)- ProgressBar、ListView

Android常用控件(三)- ProgressBar、ListView 一、 ProgressBar(进度条)的使用 示例1:一个应用程序有2个ProgressBar,让进度条显示进度。 开发步骤:...
  • kepoon
  • kepoon
  • 2011年03月03日 13:12
  • 1154

Android常用控件-ListView

Android常用控件-ListView

6.Android 游戏开发常用的系统控件(TabHost、ListView)

3.9 TabSpec与TabHost TabHost类官方文档地址:http://developer.android.com/reference/android/widget/TabHost.ht...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android常用控件之ListView(二)
举报原因:
原因补充:

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