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方法,每次