以前在用到BaseAadpter显示ListView、GridView、Spinner的时候,直接把网上现成的代码拿过来copy一下,然后修修改改就好了,一直也没有详细地总结一下,今天亲自动手写写,发现还是有不少问题的,先上个图看一下这个程序的运行结果:
利用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
android:id="@+id/my_linearlayout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:id="@+id/my_listview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
第三步:为要绘制的每一个条目创建一个布局文件,item_list.xml
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:id="@+id/myimageview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/icon"
>
android:id="@+id/mytext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/name"
/>
最后一步:也是关键所在,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()等在代码的注释中加了解释。