ListView + GridView讲解

一、ListView

  一个ListView通常有两个职责。

    (1)将数据填充到布局。

    (2)处理用户的选择点击等操作。

  一个ListView的创建需要3个元素。

    (1)ListView中的每一行View的布局。(里面可以包括图片,按钮,文字等等自定义的想要展示的内容。)

    (2)填入View的数据或者图片等。(每一行要展示的数据,比如TextView中的文字,ImageView中的图片)

    (3)连接数据与ListView的适配器Adapter。(告诉代码数据应该怎样展示,哪个View放哪些数据)

  

  (1)首先讲一下每一行的布局文件,一般以item_list_xxxx.xml命名,放置于layout文件夹中。下面举个简单的例子

    

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!-- 横向个人信息展示(头像+姓名)-->
 3 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 4     android:layout_width="match_parent"
 5     android:layout_height="wrap_content"
 6     android:orientation="horizontal">
 7 
 8     <ImageView
 9         android:id="@+id/portrait"
10         android:layout_width="50dp"
11         android:layout_height="50dp"
12         android:src="@drawable/self" />
13 
14     <TextView
15         android:id="@+id/name"
16         android:layout_width="match_parent"
17         android:layout_height="wrap_content"
18         android:layout_gravity="center_vertical"
19         android:layout_marginLeft="10dp"
20         android:text="名字"
21         android:textColor="@color/black"
22         android:textSize="@dimen/smid" />
23 
24 </LinearLayout>

 

  代码的效果如图,这就是ListView中一行的样式。

  (2)对于上个布局的例子,每一行需要的数据有两个,一个是图片头像,一个是文字姓名,所以我们用两个动态数组来保存这些数据

ArrayList<MemberStudentBean> studentNameList = new ArrayList<MemberStudentBean>();
ArrayList<Portrait> studentPortraitSignList = new ArrayList<Portrait>();

 

  其中,MemberStudentBean是一个保存用户信息的实体类,其中包含多个字段来保存用户的信息,其中有我们要展示在id=name这个TextView中的名字字段。Portrait是一个保存头像的类,其中有许多功能,在这里我们只需要知道其中的一个方法:

public void setPortraitInImageView(ImageView imageView);//将头像展示于imageView中

 

  (3)最后就是最重要的Adapter了。

    表4-5 常用适配器

Adapter

含义

ArrayAdapter<T>

用来绑定一个数组,支持泛型操作

SimpleAdapter

用来绑定在xml中定义的控件对应的数据

SimpleCursorAdapter

用来绑定游标得到的数据

BaseAdapter

通用的基础适配器

    一般我们都是写一个类继承BaseAdapter来实现我们想要的数据连接。

    

 1 public class ImageTextAdapter extends BaseAdapter {
 2 
 3     private List<MemberStudentBean> nameList;
 4     private List<Portrait> portraitList;
 5     private Context context;
 6 
 7     public ImageTextAdapter(Context context,List<MemberStudentBean> nameList,List<Portrait> portraitList){
 8         this.nameList = nameList;
 9         this.portraitList = portraitList;
10         this.context = context;
11     }
12 
13     @Override
14     public int getCount() {
15         return nameList.size();
16     }
17 
18     @Override
19     public Object getItem(int position) {
20         return nameList.get(position);
21     }
22 
23     @Override
24     public long getItemId(int position) {
25         return position;
26     }
27 
28     @Override
29     public View getView(int position, View convertView, ViewGroup parent) {
30         MyView tag;
31         if (convertView == null){
32             View v = LayoutInflater.from(context).inflate(R.layout.item_user_portrait_name,null);
33             tag = new MyView();
34             tag.imageView = (CircleImageView) v.findViewById(R.id.icon);
35             tag.textView = (TextView) v.findViewById(R.id.name);
36             v.setTag(tag);
37             convertView = v;
38         }else
39             tag = (MyView) convertView.getTag();
40         tag.textView.setText(nameList.get(position).getStudentName());
41         tag.imageView.setImageResource(R.drawable.self);
42         portraitList.get(position).setPortraitInImageView(tag.imageView);
43         tag.imageView.setBorderWidth(1);
44         tag.imageView.setBorderColor(context.getResources().getColor(R.color.borderColor));
45         return convertView;
46     }
47     private class MyView{
48         CircleImageView imageView;
49         TextView textView;
50     }
51 }

    讲几个要点,一个是要自己写一个Tag类来保存每一行的view中的控件的引用。其次是重写getView方法,每次

  

 

posted on 2016-06-28 11:11  Yesphet  阅读(912)  评论(0编辑  收藏  举报