在ListView中经常用到适配器Adapter,
android提供的三种Adapter主要有ArrayAdapter,SimpleAdapter,SimpleCursorAdapter,ArraAdapter是简单的字符串适配器,在实际项目中很少会用到(功能太有限),SimpleAdapter可以自定义ListView的每个Item的布局,一般在简单的布局中会考虑使用,而SimpleCursorAdapter主要用于数据库,前两个的数据来源一般都是String[]或者List,后一个的数据来源一般是数据库查询得到的Cursor。
每个Item的布局文件如下:
在实际的项目中,尤其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>