ListView的自定义适配器Adapter

来源:互联网 发布:des算法实例 编辑:程序博客网 时间:2024/06/05 05:45

先吹个牛

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

准备工作

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

<?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="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<CustomMessageItems> mMessageItem = new ArrayList<CustomMessageItems>();    public CustomAdapter(Context context, List<CustomMessageItems> 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<CustomMessageItems> mMessageItem = new ArrayList<CustomMessageItems>();    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

很尴尬

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

原创粉丝点击