android BaseAdapter的使用

以前在用到BaseAadpter显示ListView、GridView、Spinner的时候,直接把网上现成的代码拿过来copy一下,然后修修改改就好了,一直也没有详细地总结一下,今天亲自动手写写,发现还是有不少问题的,先上个图看一下这个程序的运行结果:

e

利用listview在界面上显示,根据不同的位置,显示不同的图片和文字。

第一步:在建立好工程后,首先来看看主类,BaseAdapterDemoActivity

package com.my;  
import android.app.Activity;  
import android.os.Bundle;  
import android.widget.ListView;  
public class BaseAdapterDemoActivity extends Activity  
{  
    private DemoAdapter adapter = null;  
    private ListView myListView = null;  
    /** Called when the activity is first created. */
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        setView();  
    }  
    private void setView()  
    {  
        myListView = (ListView) findViewById(R.id.my_listview);  
        adapter = new DemoAdapter(this);  
        myListView.setAdapter(adapter);  
    }  
}

这个BaseAdapterDemoActivity很简单,就是new一个适配器,然后把适配器放到listview当中。

第二步:BaseAdapterDemoActivity的布局文件main.xml

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_linearlayout"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >  
    <ListView  
    android:id="@+id/my_listview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >  
    </ListView>  
    <!--<GridView  
    android:id="@+id/my_gridview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >  
    </GridView>  
    <Spinner  
    android:id="@+id/my_spinner"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >  
    </Spinner>  
--></LinearLayout>

第三步:为要绘制的每一个条目创建一个布局文件,item_list.xml

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >  
    <ImageView  
    android:id="@+id/myimageview"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:src="@drawable/icon"
    >  
    </ImageView>  
<TextView   
    android:id="@+id/mytext" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/name"
    />  
</LinearLayout>

最后一步:也是关键所在,BaseAdapter

package com.my;  
import android.content.Context;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.BaseAdapter;  
import android.widget.ImageView;  
import android.widget.TextView;  
public class DemoAdapter extends BaseAdapter  
{  
    private Context c = null;  
    private LayoutInflater myInflater = null;  
    /**  
     *  构造函数  
     * @param myContext  
     */
    public DemoAdapter(Context myContext)  
    {  
        c = myContext;  
    }  
    @Override  
    public int getCount()  
    {  
        // TODO Auto-generated method stub  
        return 6;  
    }  
    @Override  
    public Object getItem(int position)  
    {  
        // TODO Auto-generated method stub  
        return position;  
    }  
    @Override  
    public long getItemId(int position)  
    {  
        // TODO Auto-generated method stub  
        return position;  
    }  
    /**  
     * 这个方法getView(),是用来逐一绘制每一条item  
     *   
     * setTag()会把View与ViewHolder绑定,形成一一对应的关系,拖动listview的时候会重新绘制每一条item  
     * 但是那些已经取得绑定的View,会调用getTag()方法,就不会重新绘制,而是拿到内存中已经取得的资源,提高了效率  
     *   
     * @param position      position就是位置从0开始  
     * @param convertView   convertView是Spinner,ListView中每一项要显示的view  
     * @param parent        parent就是父窗体了,也就是Spinner,ListView,GridView了  
     * @return              通常return 的view也就是convertView  
     */
    @Override  
    public View getView(int position, View convertView, ViewGroup parent)  
    {  
        // TODO Auto-generated method stub  
        ViewHolder holder = new ViewHolder();  
        if (convertView == null)  
        {  
            /**  
             * 在程序中动态加载以上布局:  
             * LayoutInflater flater = LayoutInflater.from(this);  
             * View view = flater.inflate(R.layout.example, null);  
             */
            myInflater = LayoutInflater.from(c);  
            convertView = myInflater.inflate(R.layout.item_list, null);  
            holder.icon = (ImageView) convertView  
                    .findViewById(R.id.myimageview);  
            holder.text = (TextView) convertView.findViewById(R.id.mytext);  
            convertView.setTag(holder);  
        }  
        else
        {  
            holder = (ViewHolder) convertView.getTag();  
        }  
        if (position <= 1)  
        {  
            holder.icon.setImageResource(R.drawable.icon);  
            holder.text.setText(R.string.text1);  
        }  
        else if (position <= 3 && position >= 2)  
        {  
            holder.icon.setImageResource(R.drawable.icon_b);  
            holder.text.setText(R.string.text2);  
        }  
        else
        {  
            holder.icon.setImageResource(R.drawable.icon_c);  
            holder.text.setText(R.string.text3);  
        }  
        return convertView;  
    }  
    private class ViewHolder  
    {  
        TextView text;  
        ImageView icon;  
    }  
}

在这段代码中有几点还是需要特别提出来:

1.构造函数public DemoAdapter(Context myContext)可以不用创建,这个创建是因为LayoutInflater需要一个Context;

2.方法public int getCount()是用来说明需要绘制的条目数量,这里是6条;

3.方法public View getView(int position, View convertView, ViewGroup parent)用来逐条绘制,也就是说每绘制一个条目就调用一次这个方法;

4.setTag() getTag()等在代码的注释中加了解释。