android BaseAdapter的使用

泡在网上的日子 / 文 发表于2012-08-19 22:29 次阅读 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()等在代码的注释中加了解释。

 

收藏 赞 (1) 踩 (0)
上一篇:Android中的adapter
因为layout五花八门,很多数据都不能直接绑定上去,所以Android引入了Adapter这个机制作为复杂数据的展示的转换载体,所以各种Adapter只不过是转换的方式和能力不一样而已。
下一篇:Android基础 : Android ContentProvider和getContentResolver
安卓系统中的数据库SqlLite操作和java中mysql的数据库操作很不一样,造成这样的原因是因为在安卓中数据库是属于进程的不存在数据库客户端,也不存在数据库服务器。所以抛开之前你对数据库的理解吧,不然你会很不习惯的。