现在我么来学习ListView的第三个适配器——BaseAdapter自定义适配器,
看下代码:
Person类:
package com.example.listview;
public class Person {
private String name;
private String number;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, String number) {
super();
this.name = name;
this.number = number;
}
}
MainActivity类
package com.example.listview;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Checkable;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.SimpleAdapter.ViewBinder;
public class MainActivity extends Activity {
private ListView lv_list;
private List<Person> list_persons;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_list = (ListView) findViewById(R.id.lv_list);
// 自定义适配器数据
list_persons = new ArrayList<Person>();
// 初始化数据
initPerson();
//创建适配器
MyAdapter myAdapter = new MyAdapter(this, list_persons);
//设置适配器
lv_list.setAdapter(myAdapter);
}
private void initPerson() {
for (int i = 0; i < 20; i++) {
Person person = new Person("孙策" + i, "年龄" + (i + 2000));
list_persons.add(person);
}
}
}
MyAdapter类
package com.example.listview;
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;
public class MyAdapter extends BaseAdapter {
private Context context;
private List<Person> list_persons;
private LayoutInflater layoutInflater;
public MyAdapter(Context context, List<Person> persons) {
super();
this.context = context;
this.list_persons = persons;
this.layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
public List<Person> getPersons() {
return list_persons;
}
public void setPersons(List<Person> persons) {
this.list_persons = persons;
}
public MyAdapter() {
super();
}
@Override
public int getCount() {
return list_persons.size();
}
@Override
public Object getItem(int position) {
return list_persons.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v;
if (convertView == null) {
v = layoutInflater.inflate(R.layout.list_item, null);
}else{
v= convertView;
}
Person person = list_persons.get(position);
TextView name = (TextView) v.findViewById(R.id.tv_name);
TextView number = (TextView) v.findViewById(R.id.tv_number);
String pname = person.getName();
String pnumber = person.getNumber();
name.setText(pname);
number.setText(pnumber);
return v;
}
}
list_item布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_name"
android:layout_width="120dp"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/tv_number"
android:layout_width="140dp"
android:layout_height="wrap_content"
/>
</LinearLayout>
activity_main.xml布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<ListView
android:id="@+id/lv_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
我们可以尝试修改MyAdapter类,ViewHolder类的复用,这种listview的优化方法可以防止图片错位(不明白不要紧,以后我会继续深入讲解listview的优化)
package com.example.listview;
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;
public class MyAdapter extends BaseAdapter {
private Context context;
private List<Person> list_persons;
private LayoutInflater layoutInflater;
public MyAdapter(Context context, List<Person> persons) {
super();
this.context = context;
this.list_persons = persons;
this.layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
public List<Person> getPersons() {
return list_persons;
}
public void setPersons(List<Person> persons) {
this.list_persons = persons;
}
public MyAdapter() {
super();
}
@Override
public int getCount() {
return list_persons.size();
}
@Override
public Object getItem(int position) {
return list_persons.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHoler holder;
if (convertView == null) {
holder=new ViewHoler();
convertView = layoutInflater.inflate(R.layout.list_item, null);
holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
holder.tv_number = (TextView) convertView.findViewById(R.id.tv_number);
convertView.setTag(holder);
} else {
holder=(ViewHoler) convertView.getTag();
}
Person person = list_persons.get(position);
String pname = person.getName();
String pnumber = person.getNumber();
holder.tv_name.setText(pname);
holder.tv_number.setText(pnumber);
return convertView;
}
// ViewHolder对应的就是控件中某一行的视图
static class ViewHoler {
TextView tv_name;
TextView tv_number;
}
}