天天看点

Android之通过BaseAdapter自定义适配器的使用

通过BaseAdapter创建自定义适配器。在所有的适配器中,通过BaseAdapter定义的适配器非常好用,可以自定义ListView每行布局的样式,使用非常的广泛,是开发过程中必不可少的。

下面看一个效果图:

Android之通过BaseAdapter自定义适配器的使用

接下来一起来实现聊天列表:

1.主布局代码:

Android之通过BaseAdapter自定义适配器的使用
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.baseadapterdemo.MainActivity" >
    
    <RelativeLayout
        android:id="@+id/relativeLayout"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#fc424c"
        android:padding="3dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp" >

        <TextView
            android:id="@+id/text2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="列表"
            android:textColor="#fff"
            android:textSize="25sp" />

    </RelativeLayout>
    
    <ListView 
        android:id="@+id/main_listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/relativeLayout"
        android:divider="#f00"
        ></ListView>

</RelativeLayout>
           

2.建立一个xml布局,是listView每行的布局:

Android之通过BaseAdapter自定义适配器的使用
<?xml version="1.0" encoding="utf-8"?>
<!--行布局文件-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:padding="4dp"
    android:orientation="vertical" >

    <ImageView
        android:padding="3dp"
        android:id="@+id/item_img"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/item_time"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:gravity="center"
        android:text="时间" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_toLeftOf="@id/item_time"
        android:layout_toRightOf="@id/item_img"
        android:layout_alignParentTop="true"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/item_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:textSize="20sp"
            android:text="张三" />

        <TextView
            android:textSize="14sp"
            android:id="@+id/item_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:text="在做什么呢?" />
    </LinearLayout>

</RelativeLayout>
           

3.创建一个实体类,用于封装数据: 每行布局中包括一个图片、姓名、聊天内容、时间,所以要将这几个数据进行封装

package com.example.vo;
/**
 * 实体类
 * 将行布局的内容进行封装
 * @author Dell
 *
 */
public class ListVO {
	//图片
	private int mImg;
	//姓名
	private String mName;
	//内容
	private String mContent;
	//时间
	private String mTime;

	//无参
	public ListVO() {
		super();
	}

	//有参
	public ListVO(int mImg, String mName, String mContent, String mTime) {
		super();
		this.mImg = mImg;
		this.mName = mName;
		this.mContent = mContent;
		this.mTime = mTime;
	}

	//setter,getter
	public int getmImg() {
		return mImg;
	}

	public void setmImg(int mImg) {
		this.mImg = mImg;
	}

	public String getmName() {
		return mName;
	}

	public void setmName(String mName) {
		this.mName = mName;
	}

	public String getmContent() {
		return mContent;
	}

	public void setmContent(String mContent) {
		this.mContent = mContent;
	}

	public String getmTime() {
		return mTime;
	}

	public void setmTime(String mTime) {
		this.mTime = mTime;
	}

}
           

4.创建自定义适配器类,继承BaseAdapter: a.定义2个参数(context,和List<实体类>),通过构造方法进行赋值. b.重写4个方法。 ①getCount()方法,返回动态数组中有多少数据。 ②getView()方法,,通过LayoutInflater对象绑定行布局文件,创建出一个View对象;通过View对象findViewByID()获得行布局控件,设置文本与图片; 返回View对象。

package com.example.adapter;
/**
 * 自定义适配器。
 */
import java.util.List;

import com.example.baseadapterdemo.R;
import com.example.vo.ListVO;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MyBaseAdapter extends BaseAdapter{
	//定义两个参数,一个是Context对象,一个是ListVO实体类型动态数组
	private Context mContext;
	private List<ListVO> mList;
	

	//有参构造
	public MyBaseAdapter(Context mContext, List<ListVO> mList) {
		super();
		this.mContext = mContext;
		this.mList = mList;
	}

	//总行数
	@Override
	public int getCount() {
		return mList.size();
	}

	@Override
	public Object getItem(int position) {
		return null;
	}

	@Override
	public long getItemId(int position) {
		return 0;
	}

	//布局
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		View view = null;
		if (convertView == null) {
			view = LayoutInflater.from(mContext).inflate(R.layout.item_main, null);
		}else {
			view = convertView;
		}
		//绑定布局
		ImageView img = (ImageView) view.findViewById(R.id.item_img);
		TextView name = (TextView) view.findViewById(R.id.item_name);
		TextView content = (TextView) view.findViewById(R.id.item_content);
		TextView time = (TextView) view.findViewById(R.id.item_time);
		//设置内容
		img.setImageResource(mList.get(position).getmImg());
		name.setText(mList.get(position).getmName());
		content.setText(mList.get(position).getmContent());
		time.setText(mList.get(position).getmTime());
		return view;
	}


}
           

5.主类  a.声明适配器控件并绑定ID; b.声明自定义适配器并实例化; c.添加数据; d.绑定适配器。

package com.example.baseadapterdemo;
import java.util.ArrayList;
import java.util.List;

import com.example.adapter.MyBaseAdapter;
import com.example.vo.ListVO;

/**
 * 主类
 */
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.widget.ListView;

public class MainActivity extends Activity {
	//适配器控件ListView
	private ListView mListView;
	//适配器
	private MyBaseAdapter mAdapter;
	//动态数组
	private List<ListVO> mList = new ArrayList<ListVO>();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
		bindID();
		//添加数据
		addData();
		//实例化适配器
		mAdapter = new MyBaseAdapter(MainActivity.this, mList);
		//绑定适配器
		mListView.setAdapter(mAdapter);
	}

	private void addData() {
		//创建对象
		ListVO v1 = new ListVO(R.drawable.a1, "张三", "最近在做什么事情呢", "11:11");
		ListVO v2 = new ListVO(R.drawable.a2, "李四", "王五说她不爱我了", "12:21");
		ListVO v3 = new ListVO(R.drawable.a3, "王五", "我抛弃了他", "13:13");
		ListVO v4 = new ListVO(R.drawable.a4, "赵六", "哈哈哈", "14:41");
		ListVO v5 = new ListVO(R.drawable.a5, "小明", "适配器好简单", "16:06");
		ListVO v6 = new ListVO(R.drawable.a6, "小刚", "6666666666", "18:11");
		ListVO v7 = new ListVO(R.drawable.a7, "李华", "英语作文被我包了", "18:51");
		//添加到数组
		mList.add(v1);
		mList.add(v2);
		mList.add(v3);
		mList.add(v4);
		mList.add(v5);
		mList.add(v6);
		mList.add(v7);
		//置为空
		v1 = null;
		v2 = null;
		v3 = null;
		v4 = null;
		v5 = null;
		v6 = null;
		v7 = null;
	}

	//绑定id
	private void bindID() {
		mListView = (ListView) findViewById(R.id.main_listView);
	}
}
           

这样就完成了。

文件打包:http://download.csdn.net/detail/qq_26239671/9715728

继续阅读