距离上篇的博客的发表,已经有好几天了。由于最近在忙着毕业答辩的事,一直抽不出时间来继续写,今晚忙完论文的事,一时,激情来临,所以又提笔。好了,转到正文,这次我讲述怎么样来自定义适配器来实现ListView。首先在我讲解怎么操作之前,我要讲解下,系统自带的适配器的工作原理,因为我觉得,只有了解了适配器的工作原理,我们写起来才不会一片茫然。
解释适配器工作原理前,我们来看下,系统自带适配器的自带的常用方法。
getItem(int position)//得到第position条条目对象
getItemId(int position)//返回其当前条目的当前ID
系统自带的适配器,其实是先调用getCount()来得到一共要显示多少条条目,然后根据当前的屏幕的宽高和控件的宽高计算得到每屏要显示几条条目。然后调用getView方法,把要显示的数据绑定到指定的控件上,并显示在屏幕上,所以我们重写getView方法时,要做的内容也是一样的,要找到指定的控件和数据,然后把数据绑定到指定的控件上,这里我们会用到一个LayoutInflater(布局填充符),它的作用是把xml的数据转换成一个view,这个大家等下看下代码大概就知道什么意思了。
所以当我们要使用自定义的适配器时,我们就需要重写这个两个方法。当然,我们不是自己真正的去重新写一个类,而是去继承BaseAdapter类,这个类是系统给我们提供的,它要求我们必须要重写上面的四个方法。其他的步骤跟上次使用系统自带的适配器来实现listview是一样的,我现在用自定义适配器来实现上次一样的的效果。
首先是main.xml添加一个listviw控件。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/listview"
/>
</LinearLayout>
然后在layout下list_item.xml条目文件
<?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" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/name"
android:paddingRight="100dip"
android:textSize="30dip"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30dip"
android:layout_toRightOf="@id/name"
android:layout_alignTop="@id/name"
android:paddingLeft="100dip"
android:id="@+id/telephone"
/>
</RelativeLayout>
添加类InfoAdapter并继承BaseAdapter
import java.util.HashMap;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
publicclass InfoAdapter extends BaseAdapter {
private List<HashMap<String, Object>> data;//要绑定的数据
privateintresource;//要绑定的那个控件的xml的ID
private LayoutInflater inflater;
public InfoAdapter(Context context,List<HashMap<String,Object>> data,int resource) {
this.data = data;
this.resource = resource;
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
publicint getCount() {//得到listview所要显示的总数目
returndata.size();
}
@Override
public Object getItem(int position) {//得到第position条条目对象
returndata.get(position);
}
@Override
publiclong getItemId(int position) {//返回其当前条目的当前ID
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {//得到当前条目的view
/*
* 判断是否是否是第一次加载,因为getview会在第一次加载时
* 把其对象全部new出来
*/
if(convertView== null){//判断是否存在view
convertView= inflater.inflate(resource, null);//根据Id,找到其所在的xml,将其转换成view对象
}
//由view对象找到指定的控件
TextView name = (TextView)convertView.findViewById(R.id.name);
TextView telephone = (TextView)convertView.findViewById(R.id.telephone);
//由position找到要绑定的数据,position为当前条目的id
HashMap<String, Object> hashMap = data.get(position);
//将要绑定的数据绑定到指定的控件上
name.setText(hashMap.get("name").toString());
telephone.setText(hashMap.get("tel").toString());
return convertView;
}
}
然后在主Activity中加入如下代码
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
publicclass CustomAdapterActivity extends Activity {
/** Calledwhen the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView listView =(ListView)findViewById(R.id.listview);
//生成动态数组,加入数据
List<HashMap<String,Object>> itemview = new ArrayList<HashMap<String,Object>>();
for (int i = 0; i < 10; i++) {
HashMap<String,Object> hashMap = new HashMap<String, Object>();
hashMap.put("name", "csk");
hashMap.put("tel", 110+i+"");
itemview.add(hashMap);
}
InfoAdapter cAdapter = new InfoAdapter(this,itemview,R.layout.list_item);//生成自定义适配器
listView.setAdapter(cAdapter);
listView.setOnItemClickListener(newOnItemClickListener() {
@Override
publicvoidonItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),"第"+(position+1)+"条数据", Toast.LENGTH_LONG).show();
}
});//添加响应事件
}
}
其测试结果和上次的测试结果一模一样,这里就不贴出测试结果了。