Android常用控件之ListView(二)
2016-05-30 14:29
726 查看
之前介绍的ListView只能显示文本或者图片,但在实际的应用中显示的内容远不止这些内容,现在我们就来对ListView进行定制,让它显示更加丰富的内容。下面我们来实现显示checkbox选中项的效果。
定制ListView最常用的Adapter还是BaseAdapter,使用它可以实现很多自己定制的列表布局,首先创建一个MyAdapter类继承BaseAdapter,代码如下:
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中加载这个适配器,代码如下:
效果如图:
定制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(); } } }); } }
效果如图:
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories