android listview高级用法
来源:互联网 发布:微信猪配音软件 编辑:程序博客网 时间:2024/05/21 17:31
ListView是一种用于垂直显示的列表控件,如果显示内容过多,则会出现垂直滚动条。它能够通过适配器将数据和自身绑定,在有限的屏幕上提供大量内容供用户选择,所以是经常使用的用户界面控件。
ListView编程的一般步骤
1)在布局文件中声明ListView控件
2) 使用一维或多维动态数组保存ListView要显示的数据 ;
3) 构建适配器Adapter,将数据与显示数据的布局页面绑定;
4)通过setAdapter()方法把适配器设置给ListView
第一步,先对main.xml进行布局。看了布局代码,大家就应该会明白了
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="horizontal" android:layout_width="fill_parent" 4 android:layout_height="wrap_content" android:gravity="center_vertical"> 5 6 <ImageView android:id="@+id/ivLogo" 7 android:layout_width="60dp" 8 android:layout_height="60dp" 9 android:src="@drawable/icon"10 android:paddingLeft="5dp" />11 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"12 android:orientation="vertical" android:layout_width="wrap_content"13 android:layout_height="wrap_content" android:gravity="right"14 android:padding="10dp">15 16 <TextView android:id="@+id/tvApplicationName"17 android:layout_width="wrap_content" 18 android:layout_height="wrap_content"19 android:textSize="16dp" />20 <TextView android:id="@+id/tvAuthor" 21 android:layout_width="wrap_content"22 android:layout_height="wrap_content" 23 android:layout_below="@id/tvApplicationName"24 android:textSize="14dp" />25 </RelativeLayout>26 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"27 android:orientation="vertical" android:layout_width="fill_parent"28 android:layout_height="wrap_content" android:gravity="right"29 android:padding="10dp">30 <TextView android:id="@+id/tvRating" 31 android:layout_width="wrap_content"32 android:layout_height="wrap_content" 33 android:text="5.0" />34 <RatingBar android:id="@+id/ratingbar" 35 android:layout_width="wrap_content"36 android:layout_height="wrap_content" 37 android:numStars="5"38 style="?android:attr/ratingBarStyleSmall" 39 android:layout_below="@id/tvRating" />40 </RelativeLayout>41 </LinearLayout>
第二步:在layout文件夹下新建一个rating.xm文件,这样做的目的是方便调用
View Code
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="horizontal" 4 android:layout_width="fill_parent" 5 android:layout_height="wrap_content" 6 android:gravity="center_vertical"> 7 <RatingBar android:id="@+id/ratingbar" 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content" 10 android:numStars="5"/>11 </LinearLayout>
第三步:编写LayoutTest04Activity,注释都在代码里
1 package cn.edu.zwu.tel; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import android.app.AlertDialog; 7 import android.app.ListActivity; 8 import android.content.Context; 9 import android.content.DialogInterface; 10 import android.content.DialogInterface.OnClickListener; 11 import android.os.Bundle; 12 import android.view.LayoutInflater; 13 import android.view.View; 14 import android.view.ViewGroup; 15 import android.widget.BaseAdapter; 16 import android.widget.ImageView; 17 import android.widget.LinearLayout; 18 import android.widget.ListView; 19 import android.widget.RatingBar; 20 import android.widget.TextView; 21 22 public class LayoutTest04Activity extends ListActivity { 23 //定义四个数组,分别做显示用 24 private static String[] applicationNames = new String[] 25 { "this is just a button","made by forrest", 26 "you can do it","come on","you will success" }; 27 private static String[] authors = new String[] 28 { "邵洋江","邵洋江","邵洋江","邵洋江","邵洋江" }; 29 private static int[] resIds = new int[] 30 { R.drawable.bg11,R.drawable.bg21,R.drawable.bg29, 31 R.drawable.bg42,R.drawable.bg45,R.drawable.bg46 }; 32 private static float[] applicationRating = new float[] 33 { (float) 5.0, (float) 5.0, (float) 3.5, (float) 5.0, (float) 4.0 }; 34 35 String inflater = Context.LAYOUT_INFLATER_SERVICE; 36 LayoutInflater layoutInflater; 37 private RatingAdapter raAdapter; 38 //自定义一个Adapter继承BaseAdapter,要重写getCount(),getItem(),getItemId(),getView()四种方法 39 private class RatingAdapter extends BaseAdapter 40 { 41 private Context context; 42 //构造函数 43 public RatingAdapter(Context context) 44 { 45 this.context = context; 46 layoutInflater = (LayoutInflater) context 47 .getSystemService(inflater); 48 } 49 50 //@Override 51 public int getCount() 52 { 53 return applicationNames.length; 54 } 55 56 // @Override 57 public Object getItem(int position) 58 { 59 return applicationNames[position]; 60 } 61 62 // @Override 63 public long getItemId(int position) 64 { 65 return position; 66 } 67 //设置星行分数 68 public void setRating(int position, float rating) 69 { 70 applicationRating[position] = rating; 71 //在adapter的数据发生变化以后通知UI主线程根据新的数据重新画图 72 notifyDataSetChanged(); 73 } 74 75 // @Override 76 public View getView(int position, View convertView, ViewGroup parent) 77 { 78 //对listview布局 79 LinearLayout linearLayout = (LinearLayout) layoutInflater.inflate( 80 R.layout.main, null); 81 //分别得到五个组件 82 ImageView ivLogo = (ImageView) linearLayout 83 .findViewById(R.id.ivLogo); 84 TextView tvApplicationName = ((TextView) linearLayout 85 .findViewById(R.id.tvApplicationName)); 86 TextView tvAuthor = (TextView) linearLayout 87 .findViewById(R.id.tvAuthor); 88 TextView tvRating = (TextView) linearLayout 89 .findViewById(R.id.tvRating); 90 RatingBar ratingBar = (RatingBar) linearLayout 91 .findViewById(R.id.ratingbar); 92 //五个组件分别得到内容 93 ivLogo.setImageResource(resIds[position]); 94 tvApplicationName.setText(applicationNames[position]); 95 tvAuthor.setText(authors[position]); 96 tvRating.setText(String.valueOf(applicationRating[position])); 97 ratingBar.setRating(applicationRating[position]); 98 return linearLayout; 99 }100 }101 102 @Override103 protected void onListItemClick(ListView l, View view, final int position,long id)104 {105 View myView = getLayoutInflater().inflate(R.layout.rating, null);106 final RatingBar ratingBar = (RatingBar) myView.findViewById(R.id.ratingbar);107 ratingBar.setRating(applicationRating[position]);108 new AlertDialog.Builder(this).setTitle(applicationNames[position])109 .setMessage("给应用程序打分").setIcon(resIds[position])110 .setView(myView).setPositiveButton("确定", new OnClickListener()111 {112 113 // @Override114 public void onClick(DialogInterface dialog, int which)115 {116 raAdapter.setRating(position, ratingBar.getRating()); 117 }118 }).setNegativeButton("取消", null).show();119 }120 121 //@Override首先先new出listview,再对每个listview进行布局,再产生一个自定义适配器,122 //再把这个适配器映射到listview中123 public void onCreate(Bundle savedInstanceState)124 {125 super.onCreate(savedInstanceState);126 List<View> viewList = new ArrayList<View>();127 viewList.add(getLayoutInflater().inflate(R.layout.main, null));128 raAdapter = new RatingAdapter(this);129 setListAdapter(raAdapter);130 }131 }
下面将对上述代码,做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,
根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),
然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,
列表将不显示同样return 1,就只显示一行。
系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,
必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。
getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。
我们用LayoutInflater的方法将定义好的rating.xml文件提取成View实例用来显示。
然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。
但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。
至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,
他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。
在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。
好了,绘制完这一行了。那再绘制下一行,直到绘完为止。
效果图:
- android listview高级用法
- Android列表用法之二:实战ListView高级用法
- Android高级控件系列之ListView的用法
- android listview 高级使用
- android高级控件ListView
- ListView android高级控件
- android高级控件-ListView
- Android高级控件之ListView
- Android Log高级用法
- Android Xml高级用法
- Android ListView常用用法
- android listView一般用法
- 转载 android listView 用法
- Android ListView常用用法
- Android ListView常用用法
- Android ListView常用用法
- Android ListView常用用法
- Android ListView常用用法
- Linux下find命令详解
- filter(字符编码过滤器)(chain.doFilter(request,response))
- 零基础小白JAVA学习笔记(二)
- linux内核完全剖析0.12笔记--第三章 内核编程语言和环境
- 杂七八
- android listview高级用法
- Error thrown by a dependency of object 'System.Data.SQLite' 解决办法
- Ajax请求缓存问题、中文乱码问题、跨域问题
- 在非unicode下取得文件路径序列
- 内存引发的风波故事
- 程序员面试、算法研究、编程艺术、红黑树4大系列集锦与总结
- 驾驶证C1考试之场地考试要求及技巧
- 并查集 (Union-Find Sets)
- Android 读取Assets中图片