ListView的自定义适配器Adapter

先吹个牛

在我刚入Android的时候,真心觉得ListView的自定义适配器好难啊,不过后来写的多了,渐渐发现它的使用方式也就那点套路,初期自学的话上手不易,但是真的上手了就会很简单了,当然了,listview的运用扩展性特别强,所以后期还得靠自己的悟性,废话不多说,最初级的教程奉上,(大神勿喷,本人菜鸟,不当之处多多包涵)

准备工作

主窗体至少得有一个listview控件吧,既然是自定义适配器,还少不了一个自定义布局的视图(view),【新手请看:listview是一个数据列表,这个自定义视图就是来定义每一行的布局】,视图的东西好像就这么多,下面是代码了
自定义视图的xml布局代码


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp" >

        <TextView
            android:id="@+id/textName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:gravity="center"
            android:text="TextView" />

        <TextView
            android:id="@+id/textSex"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:gravity="center"
            android:text="TextView" />

        <TextView
            android:id="@+id/textAge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:gravity="center"
            android:text="TextView" />

    LinearLayout>

LinearLayout>

自定义类

需要写两个类,一个是继承于BaseAdapter的自定义适配器类,暂且命名为CustomAdapter吧,还有一个类似于枚举但又不是枚举的类(这就有点尴尬了),可能有大神写成别的方式了,我个人认为我这方式也可以满足需要,类名CustomMessageItems,直接上代码吧,简单粗暴,代码里都有注释

CustomAdapter类

import java.util.ArrayList;
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;
import com.example.listview.R;

public class CustomAdapter extends BaseAdapter {

    private LayoutInflater mInflater;
    private Context context;
    private List mMessageItem = new ArrayList();

    public CustomAdapter(Context context, List mMessageItem) {

        this.context = context;
        this.mInflater = LayoutInflater.from(context);
        this.mMessageItem = mMessageItem;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mMessageItem.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return mMessageItem.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 这块代码是自定义适配器的关键,用来为自定义视图赋值以及其他操作

        ViewHolder holder;

        if (convertView == null) {

            convertView = mInflater.inflate(R.layout.lv_custom_item, null);// 将自定义xml视图装载进convertView

            holder = new ViewHolder(convertView);// 然后通过实例化,将视图传给自定义类ViewHolder,在ViewHolder中声明并绑定自定义视图中的控件
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        CustomMessageItems item = mMessageItem.get(position);
        holder.txtName.setText(item.Name);
        holder.txtSex.setText(item.Sex);
        holder.txtAge.setText(item.Age);

        return convertView;// 将装载完毕的视图返回给listview
    }

    private class ViewHolder {
        TextView txtName, txtSex, txtAge;

        public ViewHolder(View v) {
            txtName = (TextView) v.findViewById(R.id.textName);
            txtSex = (TextView) v.findViewById(R.id.textSex);
            txtAge = (TextView) v.findViewById(R.id.textAge);
        }
    }
}

我觉得注释已经很详细了,就不多言了。

CustomMessageItems类(这个不伦不类,见笑了)

public class CustomMessageItems {
    public String Name;
    public String Sex;
    public String Age;
}

这个类就这么多,主要是为每一行的自定义布局提供数据

开始装载listview

视图和类都准备好了,开始将自定义视图与listview建立联系,这才是我们的最终目的!
listview控件声明的事我就不提了

准备数据
实例化一个装载CustomMessageItems 的List数据集,用来收集数据

List<CustomMessageItems> mMessageItem = new ArrayList<CustomMessageItems>();

实例化适配器
将刚才自定义的适配器进行实例化,传入List数据集和当前Context

CustomAdapter myAdapter;//声明部分
myAdapter = new CustomAdapter(MainActivity.this, mMessageItem);

接着就是将Adapter装载进listview

listview.setAdapter(myAdapter);

以下是完整代码

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import com.example.listview.R;

public class MainActivity extends Activity {

    ListView listview;
    List mMessageItem = new ArrayList();
    CustomAdapter myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listview = (ListView) findViewById(R.id.listView1);

        bindDate();
    }

    private void bindDate() {
        // TODO Auto-generated method stub

        CustomMessageItems item = new CustomMessageItems();
        item.Name = "李明";
        item.Sex = "男";
        item.Age = "20岁";
        mMessageItem.add(item);
        item = new CustomMessageItems();
        item.Name = "小红";
        item.Sex = "女";
        item.Age = "12岁";
        mMessageItem.add(item);
        item = new CustomMessageItems();
        item.Name = "张萌萌";
        item.Sex = "女";
        item.Age = "28岁";
        mMessageItem.add(item);
        item = new CustomMessageItems();
        item.Name = "刘韬";
        item.Sex = "男";
        item.Age = "22岁";
        mMessageItem.add(item);

        myAdapter = new CustomAdapter(MainActivity.this, mMessageItem);
        listview.setAdapter(myAdapter);
    }
}

很清晰了吧,收工!
源码地址:http://download.csdn.net/download/qq_23931287/9944412

很尴尬

发现一个很严重的问题,我刚知道,资源下载至少一积分,这就有点尴尬了,老规矩,需要源码工程的留邮箱

你可能感兴趣的:(Android小笔记)