本文讲实现一个自定义列表的Android程序,程序将实现一个使用自定义的适配器(Adapter)绑定
数据,通过contextView.setTag绑定数据有按钮的ListView。
系统显示列表(ListView)时,首先会实例化一个适配器,本文将实例化一个自定义的适配器。实现
自定义适配器,必须手动映射数据,这时就需要重写getView()方法,系统在绘制列表的每一行的时候
将调用此方法。
ListView在开始绘制的时候,系统自动调用getCount()函数,根据函数返回值得到ListView的长度,
然后根据这个长度,调用getView()逐一画出每一行。
具体使用方法可以参考下面代码,只需记住Android自定义ListView三步骤:
第一步:准备主布局文件、组件布局文件等
第二步:获取并整理数据
第三部:绑定数据,这里我们是通过自己编写Adapter类来完成的
1.首先新建一个list.XML
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. "match_parent"
4. "match_parent"
5. "vertical" >
6. "match_parent"
7. "match_parent"
8. "horizontal" android:background="#f1e4f1">
9. <ImageView
10. "@+id/image"
11. "wrap_content"
12. "wrap_content"/>
13. <TextView
14. "@+id/title"
15. "wrap_content"
16. "wrap_content"
17. "#666872"/>
18. <Button
19. "@+id/view"
20. "wrap_content"
21. "wrap_content"
22. "详细"/>
23. </LinearLayout>
24. <TextView
25. "@+id/info"
26. "wrap_content"
27. "wrap_content"
28. "#666872"/>
29. </LinearLayout>
2、新建一个适配器类MyAdspter.java
1. public class MyAdspter extends BaseAdapter {
2.
3. private List<Map<String, Object>> data;
4. private LayoutInflater layoutInflater;
5. private Context context;
6. public MyAdspter(Context context,List<Map<String, Object>> data){
7. this.context=context;
8. this.data=data;
9. this.layoutInflater=LayoutInflater.from(context);
10. }
11. /**
12. * 组件集合,对应list.xml中的控件
13. * @author Administrator
14. */
15. public final class Zujian{
16. public ImageView image;
17. public TextView title;
18. public Button view;
19. public TextView info;
20. }
21. @Override
22. public int getCount() {
23. return data.size();
24. }
25. /**
26. * 获得某一位置的数据
27. */
28. @Override
29. public Object getItem(int position) {
30. return data.get(position);
31. }
32. /**
33. * 获得唯一标识
34. */
35. @Override
36. public long getItemId(int position) {
37. return position;
38. }
39.
40. @Override
41. public View getView(int position, View convertView, ViewGroup parent) {
42. null;
43. if(convertView==null){
44. new Zujian();
45. //获得组件,实例化组件
46. null);
47. zujian.image=(ImageView)convertView.findViewById(R.id.image);
48. zujian.title=(TextView)convertView.findViewById(R.id.title);
49. zujian.view=(Button)convertView.findViewById(R.id.view);
50. zujian.info=(TextView)convertView.findViewById(R.id.info);
51. convertView.setTag(zujian);
52. else{
53. zujian=(Zujian)convertView.getTag();
54. }
55. //绑定数据
56. "image"));
57. "title"));
58. "info"));
59. return convertView;
60. }
61.
62. }
关于上面LayoutInflater的使用:在实际开发种LayoutInflater这个类还是非常有用的。它的作用类似
于 findViewById(),不同点是LayoutInflater是用来找layout下xml布局文件,并且会实例化!。
getView()的三个参数:position表示将显示的是第几行,covertView是从布局文件中inflate来的布
局。我们用LayoutInflater的方法将定义好的list.xml文件提取成View实例用来显示。然后将xml文件
中的各个组件实例化,这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为
它添加点击监听器,这样就能捕获点击事件。
3、activity_main.xml中添加ListView控件
1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2. "http://schemas.android.com/tools"
3. "match_parent"
4. "match_parent"
5. "@dimen/activity_vertical_margin"
6. "@dimen/activity_horizontal_margin"
7. "@dimen/activity_horizontal_margin"
8. "@dimen/activity_vertical_margin"
9. ".MainActivity" >
10. <ListView
11. "@+id/list"
12. "fill_parent"
13. "fill_parent"></ListView>
14. </RelativeLayout>
4、在activity中调用ListView
1. public class MainActivity extends Activity {
2.
3. private ListView listView=null;
4. @Override
5. protected void onCreate(Bundle savedInstanceState) {
6. super.onCreate(savedInstanceState);
7. setContentView(R.layout.activity_main);
8. listView=(ListView)findViewById(R.id.list);
9. List<Map<String, Object>> list=getData();
10. new MyAdspter(this, list));
11. }
12. @Override
13. public boolean onCreateOptionsMenu(Menu menu) {
14. getMenuInflater().inflate(R.menu.main, menu);
15. return true;
16. }
17.
18. public List<Map<String, Object>> getData(){
19. new ArrayList<Map<String,Object>>();
20. for (int i = 0; i < 10; i++) {
21. new HashMap<String, Object>();
22. "image", R.drawable.ic_launcher);
23. "title", "这是一个标题"+i);
24. "info", "这是一个详细信息"+i);
25. list.add(map);
26. }
27. return list;
28. }
29. }