在实际的项目中,尤其listView的每个Item的布局比较复杂的时候,我们一般都要自定义自己的Adapter,要实现自己的Adapter,我们需要继承BaseAdapter类,同时要覆写其中的四个方法:
public int getCount() :该方法返回ListView中要显示的子View的数量;
public Object getItem(int position):该方法返回一个子View,即listView中的一个子条目,也可以返回自己想要的信息。
public long getItemId(int position):该方法根据Item在listview中的位置,返回其id;
public View getView(int position, View convertView, ViewGroup parent) :该方法是最重要的,也是最难理解的了,它返回的是id为position的Item布局文件对应的View,该View中的各组件可以在getView方法中配置其显示。
这里还有一个点需要说明,就是LayoutInflater类,它的inflate()方法可以根据布局文件获得其View返回值,接下来我们就可以取得该View中的各个组件,便可以为其设置资源,从而配置其显示。
一个简单的自定义实现Adapter的代码类如下:
package com.example.activity; import com.example.activity.R; import android.app.Activity; 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.ListView; import android.widget.TextView; public class MenuActivity extends Activity { private ListView list = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu); list = (ListView)findViewById(R.id.list); MyAdapter mAdapter = new MyAdapter(); list.setAdapter(mAdapter); } //自定义Adapter class MyAdapter extends BaseAdapter{ int[] images = new int[]{ R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher, R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher, R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher, R.drawable.ic_launcher }; String[] names = new String[]{ "干锅兔肉","水煮牛肉","剁椒鱼头","腊牛肉","藏香鸡", "蒜茸蒸茄子","小炒肚丝","鳝鱼煨黄瓜","养生健康汤","鲜鱼汤" }; String[] prices = new String[]{ "28","32","28","32","32", "28","28","26","20","30" }; @Override public int getCount() { // TODO Auto-generated method stub return names.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } //该方法返回整个Item的布局View @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if(convertView == null){ //根据布局文件获取其view返回值 convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.layout_adapter, null); } //获取listview中每个Item布局文件中的的子组件的ID ImageView image = (ImageView)convertView.findViewById(R.id.image); TextView name = (TextView)convertView.findViewById(R.id.name_course); TextView price_number = (TextView)convertView.findViewById(R.id.price_number); //为对应的Item中的各个组件设置资源,从而配置其显示 image.setImageResource(images[position]); name.setText(names[position]); price_number.setText(prices[position]); return convertView; } } }
每个Item的布局文件如下:
<?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" android:orientation="vertical" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dip" android:src="@drawable/ic_launcher" android:layout_marginTop="3dip" /> <TextView android:id="@+id/name_course" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="8dip" android:layout_marginTop="5dip" android:text="水煮活鱼" android:layout_below="@id/image" android:textSize="16sp"/> <TextView android:id="@+id/price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/image" android:layout_marginLeft="15dp" android:layout_toRightOf="@+id/name_course" android:text="价格:" android:textSize="22sp" /> <TextView android:id="@+id/price_number" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/name_course" android:layout_centerHorizontal="true" android:text="48元" android:textSize="22sp"/> </RelativeLayout>
最终的运行效果如下: