1. ListView
LIstView是一个ViewGroup的子类,以数组的形式存放子控件,通过上下滑动来展示所有控件。使用ListView首先要实现ListAdapter类适配器,Android SDK提供了多个ListAdapter类适配器,最常用的是ArrayAdapter<T>和BaseAdapter。ArrayAdapter<T>相当于BaseAddapter中内置了一个ArrayList,指定泛型后可以使用ArrayAdapter中的add(T)方法添加对象不需要自己新建数组。
实现Adapter时主要是改写getView方法,ListView会调用getView方法来得到每一个view,然后将view依次展现在屏幕中
2. GridView
GridView与ListView类似,以网格的形式将适配器中的view展现在屏幕中
android:numColumns设置显示的列数
android:columnWidth 设置列的宽度
android;horizontalSpacing 设置列的水平间距
android:verticalSpacing 设置行间距
3. 练习:模仿微信关于页面
3.1首先新建项目WeChatTest,在activity_main.xml中添加ListView
<ListView android:id="@+id/list_view" android:layout_below="@+id/tbar" android:layout_width="match_parent" android:layout_height="match_parent" />
3.2新建一个ListViewItem类用来存放提供给LIstView的数据
public class ListViewItem { private String item=""; ListViewItem(String str){ item=str; } }
3.3设置适配器继承于ArrayAdapter并指定泛型
写构造器方法接受Context上下文和布局文件
重写getView方法
/** Created by chao on 7/23/16. */ public class WeChatArrayAdapter extends ArrayAdapter<ListViewItem> { private Context context; private int resurces; private ViewHolder viewholder; /** * * @param context * @param resurces */ //构造器接受Context上下文和LIstView中的子布局文件 WeChatArrayAdapter(Context context,int resurces){ super(context,resurces); this.context=context; this.resurces=resurces; } @Override public View getView(final int position, View convertView, ViewGroup parent) { //通过position找到用来存放数据的对象 ListViewItem item=getItem(position); View view; //ViewHolder用来保存View对象以便复用 viewholder = new ViewHolder(); if(convertView==null){ //如果convertView为空,即没有可回收的View时通过LayoutInflater来解析布局文件 view= LayoutInflater.from(context).inflate(resurces,null); viewholder.textView=(TextView) view.findViewById(R.id.view_item); //将textView保存起来 view.setTag(viewholder); }else{ //当有可回收的View时,直接使用 view=convertView; viewholder =(ViewHolder) view.getTag(); } //将数据添加到相应的控件中 viewholder.textView.setText(item.getItem()); //设置ListView中子控件的点击事件 viewholder.textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(context,position+"",Toast.LENGTH_SHORT).show(); } }); return view; } class ViewHolder{ public TextView textView; } }
3.4 在MainActivity中新建适配器并初始化
//新建适配器传入布局文件 WeChatArrayAdapter adapter=new WeChatArrayAdapter(this,R.layout.list_view_item); //初始化适配器 initAdapter(adapter);
public void initAdapter(WeChatArrayAdapter adapter){ adapter.add(new ListViewItem("去评分")); adapter.add(new ListViewItem("功能介绍")); adapter.add(new ListViewItem("系统通知")); adapter.add(new ListViewItem("帮助与反馈")); adapter.add(new ListViewItem("投诉")); adapter.add(new ListViewItem("检查新版本")); }
找到ListView设置Adapter
//找到ListView设置Adapter ListView listView=(ListView) findViewById(R.id.list_view); listView.setAdapter(adapter);
3.5 添加HeadView和FooterView
新建header_view.xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="false"> <ImageView android:layout_width="wrap_content" android:layout_height="70dp" android:layout_gravity="center_horizontal" android:src="@drawable/acf" android:scaleType="centerInside" android:layout_marginTop="30dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="@string/wechat_number" android:textSize="18sp" android:layout_marginTop="16dp" android:layout_marginBottom="20dp" /> </LinearLayout>
新建footer_view.xml文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/text_view_3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/copyright3" android:layout_centerHorizontal="true" android:layout_below="@+id/text_view_2" android:layout_marginBottom="8dp" /> <TextView android:id="@+id/text_view_2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/copyright2" android:layout_centerHorizontal="true" android:layout_below="@+id/text_view_1"/> <TextView android:id="@+id/text_view_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/copyright" android:layout_centerHorizontal="true" android:layout_below="@+id/text_view_privacy"/> <TextView android:id="@+id/text_view_privacy" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/terms_privacy" android:textSize="16sp" android:textColor="#5C6BC0" android:layout_marginTop="30dp" android:layout_marginBottom="8dp" android:layout_centerHorizontal="true" android:background="@android:drawable/list_selector_background" /> </RelativeLayout>
在MainActivity中设置HeaderView和FooderView
View headerView= LayoutInflater.from(this).inflate(R.layout.header_view,null); View footerView=LayoutInflater.from(this).inflate(R.layout.footer_view,null);
添加到ListView
listView.addHeaderView(headerView,null,false); listView.addFooterView(footerView,null,false);
3.6编译运行结果