安卓android listview高级用法
这是我listview用的最高级的地方了,所谓的高级在你们眼里也许是低级。这里主要实现了可以对listview进行监听。
ListView是一种用于垂直显示的列表控件,如果显示内容过多,则会出现垂直滚动条。它能够通过适配器将数据和自身绑定,在有限的屏幕上提供大量内容供用户选择,所以是经常使用的用户界面控件。
ListView编程的一般步骤
1)在布局文件中声明ListView控件
2) 使用一维或多维动态数组保存ListView要显示的数据 ;
3) 构建适配器Adapter,将数据与显示数据的布局页面绑定;
4)通过setAdapter()方法把适配器设置给ListView
第一步,先对main.xml进行布局。看了布局代码,大家就应该会明白了
View Code
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:gravity="center_vertical">
<ImageView android:id="@+id/ivLogo"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/icon"
android:paddingLeft="5dp" />
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:gravity="right"
android:padding="10dp">
<TextView android:id="@+id/tvApplicationName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16dp" />
<TextView android:id="@+id/tvAuthor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tvApplicationName"
android:textSize="14dp" />
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:gravity="right"
android:padding="10dp">
<TextView android:id="@+id/tvRating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5.0" />
<RatingBar android:id="@+id/ratingbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="5"
style="?android:attr/ratingBarStyleSmall"
android:layout_below="@id/tvRating" />
</RelativeLayout>
</LinearLayout>
第二步:在layout文件夹下新建一个rating.xm文件,这样做的目的是方便调用
View Code
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<RatingBar android:id="@+id/ratingbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="5"/>
</LinearLayout>
第三步:编写LayoutTest04Activity,注释都在代码里
View Code
package cn.edu.zwu.tel;
import java.util.ArrayList;
import java.util.List;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RatingBar;
import android.widget.TextView;
public class LayoutTest04Activity extends ListActivity {
//定义四个数组,分别做显示用
private static String\[\] applicationNames = new String\[\]
{ "this is just a button","made by forrest",
"you can do it","come on","you will success" };
private static String\[\] authors = new String\[\]
{ "邵洋江","邵洋江","邵洋江","邵洋江","邵洋江" };
private static int\[\] resIds = new int\[\]
{ R.drawable.bg11,R.drawable.bg21,R.drawable.bg29,
R.drawable.bg42,R.drawable.bg45,R.drawable.bg46 };
private static float\[\] applicationRating = new float\[\]
{ (float) 5.0, (float) 5.0, (float) 3.5, (float) 5.0, (float) 4.0 };
String inflater = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater layoutInflater;
private RatingAdapter raAdapter;
//自定义一个Adapter继承BaseAdapter,要重写getCount(),getItem(),getItemId(),getView()四种方法
private class RatingAdapter extends BaseAdapter
{
private Context context;
//构造函数
public RatingAdapter(Context context)
{
this.context = context;
layoutInflater = (LayoutInflater) context
.getSystemService(inflater);
}
//@Override
public int getCount()
{
return applicationNames.length;
}
// @Override
public Object getItem(int position)
{
return applicationNames\[position\];
}
// @Override
public long getItemId(int position)
{
return position;
}
//设置星行分数
public void setRating(int position, float rating)
{
applicationRating\[position\] = rating;
//在adapter的数据发生变化以后通知UI主线程根据新的数据重新画图
notifyDataSetChanged();
}
// @Override
public View getView(int position, View convertView, ViewGroup parent)
{
//对listview布局
LinearLayout linearLayout = (LinearLayout) layoutInflater.inflate(
R.layout.main, null);
//分别得到五个组件
ImageView ivLogo = (ImageView) linearLayout
.findViewById(R.id.ivLogo);
TextView tvApplicationName = ((TextView) linearLayout
.findViewById(R.id.tvApplicationName));
TextView tvAuthor = (TextView) linearLayout
.findViewById(R.id.tvAuthor);
TextView tvRating = (TextView) linearLayout
.findViewById(R.id.tvRating);
RatingBar ratingBar = (RatingBar) linearLayout
.findViewById(R.id.ratingbar);
//五个组件分别得到内容
ivLogo.setImageResource(resIds\[position\]);
tvApplicationName.setText(applicationNames\[position\]);
tvAuthor.setText(authors\[position\]);
tvRating.setText(String.valueOf(applicationRating\[position\]));
ratingBar.setRating(applicationRating\[position\]);
return linearLayout;
}
}
@Override
protected void onListItemClick(ListView l, View view, final int position,long id)
{
View myView = getLayoutInflater().inflate(R.layout.rating, null);
final RatingBar ratingBar = (RatingBar) myView.findViewById(R.id.ratingbar);
ratingBar.setRating(applicationRating\[position\]);
new AlertDialog.Builder(this).setTitle(applicationNames\[position\])
.setMessage("给应用程序打分").setIcon(resIds\[position\])
.setView(myView).setPositiveButton("确定", new OnClickListener()
{
// @Override
public void onClick(DialogInterface dialog, int which)
{
raAdapter.setRating(position, ratingBar.getRating());
}
}).setNegativeButton("取消", null).show();
}
//@Override首先先new出listview,再对每个listview进行布局,再产生一个自定义适配器,
//再把这个适配器映射到listview中
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
List<View> viewList = new ArrayList<View>();
viewList.add(getLayoutInflater().inflate(R.layout.main, null));
raAdapter = new RatingAdapter(this);
setListAdapter(raAdapter);
}
}
下面将对上述代码,做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,
根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),
然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,
列表将不显示同样return 1,就只显示一行。
系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,
必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。
getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。
我们用LayoutInflater的方法将定义好的rating.xml文件提取成View实例用来显示。
然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。
但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。
至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,
他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。
在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。
好了,绘制完这一行了。那再绘制下一行,直到绘完为止。
效果图: