Android中自定义ListView
1. 自定义ListView,效果图:
2. 代码实现:
(1)res/layout/main.xml实现:
1. <?xml version="1.0" encoding="utf-8"?>
2.
3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
4. "vertical"
5. "fill_parent"
6. "fill_parent"
7. >
8.
9. <com.focus.fishme.SelfListView
10. "@+id/ListView"
11. "vertical"
12. "fill_parent"
13. "fill_parent"
14. />
15.
16. </LinearLayout>
(2)ListView的Item布局实现:
1. <?xml version="1.0" encoding="UTF-8"?>
2.
3. <LinearLayout
4. "http://schemas.android.com/apk/res/android"
5. "vertical"
6. "fill_parent"
7. "fill_parent"
8. >
9.
10. <TextView
11. "@+id/TextViewOne"
12. "wrap_content"
13. "wrap_content"
14. "10dip"
15. "24sp"
16. />
17.
18. <TextView
19. "@+id/TextViewTwo"
20. "wrap_content"
21. "wrap_content"
22. "10dip"
23. />
24.
25. <View
26. "1dip"
27. "fill_parent"
28. "#FF0000"
29. />
30.
31. </LinearLayout>
(3)主Activity实现:
1. package com.focus.fishme;
2.
3. import java.util.ArrayList;
4. import java.util.HashMap;
5. import java.util.List;
6. import java.util.Map;
7.
8. import android.app.Activity;
9. import android.os.Bundle;
10.
11. public class SelfListViewActivity extends Activity {
12.
13. @Override
14. public void onCreate(Bundle savedInstanceState) {
15. super.onCreate(savedInstanceState);
16.
17. /**
18. * 设置主布局。
19. */
20. setContentView(R.layout.main);
21.
22. /**
23. * ListView数据集。
24. */
25. List<Map<String , Object>> mSelfData = new ArrayList<Map<String,Object>>();
26.
27. /**
28. * 获取ListView组件。
29. */
30. SelfListView mSelfListView = (SelfListView) findViewById(R.id.ListView);
31.
32. /**
33. * 生成数据。
34. */
35. for (int i = 0; i < 10; i++) {
36. HashMap<String, Object> mMap = new HashMap<String, Object>();
37. mMap.put("key_name", "name" + i);
38. mMap.put("value_name", "value" + i);
39. mSelfData.add(mMap);
40. }
41.
42. /**
43. * 自定义Adapter。
44. */
45. final SelfAdapter mSelfAdapter = new SelfAdapter(this, mSelfData,
46. .layout.item, new String[] { "key_name", "value_name" }, new int[] { R.id.TextViewOne, R.id.TextViewTwo });
47.
48. /**
49. * 向ListView设置Adapter。
50. */
51. .setSelfAdapter(mSelfAdapter);
52. }
53.
54. }
(4)ListView所用Adapter实现:
1. package com.focus.fishme;
2.
3. import java.util.List;
4. import java.util.Map;
5.
6. import android.content.Context;
7. import android.view.LayoutInflater;
8. import android.view.View;
9. import android.view.ViewGroup;
10. import android.widget.BaseAdapter;
11. import android.widget.TextView;
12.
13. public class SelfAdapter extends BaseAdapter {
14.
15. private LayoutInflater mLayoutInflater;
16.
17. private int mResource;
18. private List<? extends Map<String, ?>> mSelfData;
19. private String[] from;
20. private int[] to;
21.
22. public SelfAdapter(Context context, List<? extends Map<String, ?>> data, int resouce, String[] from, int[] to) {
23. this.mSelfData = data;
24. this.mResource = resouce;
25. this.mSelfData = data;
26. this.from = from;
27. this.to = to;
28. this.mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
29. }
30.
31. public int getCount() {
32. return mSelfData.size();
33. }
34.
35. public Object getItem(int position) {
36. return mSelfData.get(position);
37. }
38.
39. public String get(int position, Object key) {
40. Map<String, ?> map = (Map<String, ?>) getItem(position);
41. return map.get(key).toString();
42. }
43.
44. public long getItemId(int position) {
45. return position;
46. }
47.
48. /**
49. * 生成ListView的Item布局。
50. */
51. public View getView(int position, View convertView, ViewGroup parent) {
52. if (convertView == null) {
53. null);
54. }
55.
56. Map<String, ?> item = mSelfData.get(position);
57.
58. int count = to.length;
59.
60. for (int i = 0; i < count; i++) {
61. View v = convertView.findViewById(to[i]);
62. bindView(v, item, from[i]);
63. }
64.
65. convertView.setTag(position);
66.
67. return convertView;
68. }
69.
70. private void bindView(View view, Map<String, ?> item, String from) {
71. Object data = item.get(from);
72.
73. if (view instanceof TextView) {
74. null ? "" : data.toString());
75. }
76. }
77.
78. }
(5)自定义ListView实现:
1. package com.focus.fishme;
2.
3. import android.content.Context;
4. import android.util.AttributeSet;
5. import android.view.View;
6. import android.widget.BaseAdapter;
7. import android.widget.LinearLayout;
8.
9. public class SelfListView extends LinearLayout {
10.
11. private BaseAdapter mSelfAdapter;
12.
13. public SelfListView(Context context) {
14. super(context);
15. }
16.
17. public SelfListView(Context context, AttributeSet attributeSet) {
18. super(context, attributeSet);
19. }
20.
21. /**
22. * 删除ListView中上一次渲染的View,并添加新View。
23. */
24. private void buildList() {
25. if (mSelfAdapter == null) {
26.
27. }
28.
29. if (getChildCount() > 0) {
30. removeAllViews();
31. }
32.
33. int count = mSelfAdapter.getCount();
34.
35. for(int i = 0 ; i < count ; i++) {
36. null, null);
37. if (view != null) {
38. addView(view, i);
39. }
40. }
41. }
42.
43. public BaseAdapter getSelfAdapter() {
44. return mSelfAdapter;
45. }
46.
47. /**
48. * 设置Adapter。
49. *
50. * @param selfAdapter
51. */
52. public void setSelfAdapter(BaseAdapter selfAdapter) {
53. this.mSelfAdapter = selfAdapter;
54. buildList();
55. }
56.
57. }