王学岗ListView和源码解析(三)

来源:互联网 发布:android开源app源码 编辑:程序博客网 时间:2024/05/21 00:01

现在我么来学习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;    }}
0 0
原创粉丝点击