ListView与适配器

ListView 是标准的MVC写法:
  M  modle    数据模型    List<Person>
  V  view             视图       ListView
  C  controller      控制器    Adapter

 

1. BaseAdapter是适配器的基础类,自定义适配器一般都继承自该类,在上节的基础上创建一个ListView:

<ListView

        android:id="@+id/lv"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"/>

 

再创建一个流式布局的xml文件,用于ListView中选项数据的展示:

<TextView

        android:id="@+id/tv_id"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_margin="5dip"

        android:text="id"

        android:textColor="#ff0000"

        android:textSize="20sp" />

 

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="60dip"

        android:layout_margin="20dip"

        android:gravity="center_vertical"

        android:orientation="vertical" >

 

        <TextView

            android:id="@+id/tv_name"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_margin="5dip"

            android:text="姓名"

            android:textColor="#000000"

            android:textSize="18sp" />

 

        <TextView

            android:id="@+id/tv_phone"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_marginLeft="5dip"

            android:text="电话"

            android:textColor="#880000"

            android:textSize="16sp" />

    </LinearLayout>

 

接下来再创建一个继承自BaseAdapter适配器类:

//默认实现类 simpleXXX efaultXXX baseXXX

    private class MyAdapter extends BaseAdapter{

 

        private static final String TAG = "MyAdapter";

 

        /**

         *控制listview里面总共有多少个条目

         */

        @Override

        public int getCount() {

            return persons.size();//条目个数 == 集合的size

        }

 

        @Override

        public Object getItem(int position) {

            return null;

        }

 

        @Override

        public long getItemId(int position) {

            return 0;

        }

 

        @Override

        public View getView(int position, View convertView, ViewGroup parent) {

            Log.i(TAG, "返回view对象,位置:"+position);

            //得到某个位置对应的person对象

            Person person = persons.get(position);

            View view = View.inflate(MainActivity.this, R.layout.list_item, null);

            //一定要在view对象里面寻找孩子的id

            TextView tv_id = (TextView) view.findViewById(R.id.tv_id);

            tv_id.setText("id:" + person.getId());

           

            TextView tv_name = (TextView) view.findViewById(R.id.tv_name);

            tv_name.setText("姓名:" + person.getName());

           

            TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);

            tv_phone.setText("电话:" + person.getNumber());

           

            return view;

        }

       

    }

 

最后在onCreate方法中设置适配器即可:

@Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main_activity);

       

        PersonDao dao = new PersonDao(MainActivity.this);

        persons = dao.findAll();

        lv = (ListView) findViewById(R.id.lv);

        lv.setAdapter(new MyAdapter());

       

    }

 

 

 

 

2. ArrayAdapter是继承自BaseAdapter中最简单的适配器,只能用于基本的数据填充:

同理创建一个有ListView控件的布局,接下来在创建ListView选项布局:

<ImageView

        android:id="@+id/iv"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:src="@drawable/ic_launcher"/>

   

    <TextView

        android:id="@+id/tv"

        android:layout_width="wrap_content"

        android:text="aaaaaaaaa"

        android:layout_height="wrap_content"/>

 

 

接下来在MainActivity中定义一个数组用于填充适配器的数据,再设置适配器即可:

 

private static String[] names = { "功能1", "功能2", "功能3" };

    private ListView lv;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

 

        lv = (ListView) findViewById(R.id.lv);

        lv.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item,

                R.id.tv, names));

 

    }

 

 

 

3. SimpleAdapter也是继承自BaseAdapter并以键值对填充的适配器,用户处理比较复杂的选项布局:

与上面同理,先创建ListView组件,在创建一个选项布局:

<ImageView

        android:id="@+id/iv"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"/>

   

    <TextView

        android:id="@+id/tv"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"/>

 

接下来即可在MainActivity类中操作:

        ListView lv = findViewById(R.id.lv);

        List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();

 

        Map<String, Object> map1 = new HashMap<String, Object>();

        map1.put("nametext", "我是第一个功能");

        map1.put("iconid", R.drawable.arrow_up_float);

 

        Map<String, Object> map2 = new HashMap<String, Object>();

        map2.put("nametext", "我是第二个功能");

        map2.put("iconid", R.drawable.alert_light_frame);

 

        Map<String, Object> map3 = new HashMap<String, Object>();

        map3.put("nametext", "我是第三个功能");

        map3.put("iconid", R.drawable.bottom_bar);

 

        data.add(map1);

        data.add(map2);

        data.add(map3);

 

        //data 绑定的数据。 list集合

        //R.layout.list_item, 数据显示对应的布局

        //要让数据跟view 对象建立一个映射关系

        //from[] map集合里面数据的key

        //to[] 布局文件里面的 id

        lv.setAdapter(new SimpleAdapter(this, data, R.layout.list_item,

                new String[] { "nametext", "iconid" }, new int[] { R.id.tv,

                        R.id.iv }));

 

    }

posted @ 2015-10-18 10:40  飞牛冲天  阅读(274)  评论(0编辑  收藏  举报