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

现在我么来学习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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值