Android ListView通用适配器升级支持多种布局

之前研究过并且写过一个listview通用的适配器,但是那个适配器不适用于多布局的情况,于是博客对适配器进行升级

先放上一个效果图,不是很美光,这是布局设计的问题,这里不深究:


贴上实现的代码:

首先是一个字母头的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:padding="8dp"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/tag"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:textColor="#0000FF"
        android:text="tag" />

</RelativeLayout>

然后是显示名称的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:padding="8dp"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/icon"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/name"
        android:layout_marginLeft="10dp"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/icon"
        android:layout_width="wrap_content"
        android:textSize="22sp"
        android:layout_height="wrap_content"
        android:text="name" />

</RelativeLayout>

最后是Activity中的代码

public class MainActivity extends Activity {

	private ListView lv = null;

	private List<Info> data = new ArrayList<Info>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		//准备一些数据
		data.add(new Info("A", null));
		data.add(new Info(null, "阿香"));

		data.add(new Info("B", null));
		data.add(new Info(null, "爸爸"));

		data.add(new Info("C", null));
		data.add(new Info(null, "陈大壮"));
		data.add(new Info(null, "陈翔"));
		data.add(new Info(null, "陈小庄"));

		data.add(new Info("D", null));
		data.add(new Info(null, "大明"));
		
		//找到listview控件
		lv = (ListView) findViewById(R.id.lv);
		//设置listview的适配器
		lv.setAdapter(new MultiCommonAdapter<Info>(this, data, new int[] { R.layout.tag, R.layout.item }) {

			@Override
			public void convert(CommonViewHolder h, Info entity, int position, int layoutIndex) {
				switch (layoutIndex) {
				//根据不同的布局进行设置显示的文本
				case 0:
					h.setText(R.id.tag, entity.getTagName());
					break;
				case 1:
					h.setText(R.id.name, entity.getName());
					break;
				}
			}

			@Override
			public int getLayoutIndex(Info entity) {
				//判断该使用第几个布局
				return entity.getTagName() == null ? 1 : 0;
			}
		});
	}

}
Info对象就是一个普通的实体对象

public class Info {
	private String tagName;
	private String name;

	public String getTagName() {
		return tagName;
	}

	public void setTagName(String tagName) {
		this.tagName = tagName;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Info(String tagName, String name) {
		super();
		this.tagName = tagName;
		this.name = name;
	}

}

使用的代码很简单

在创建适配器的时候传入多个布局文件id即可,使用非常方便,并且封装了几个常用的操作,比如设置文本,设置图片等等,如果读者有需要可以自行参考代码添加!

convert方法用来实现项目中的逻辑

getLayoutIndex方法用来获取每一个实体对象该使用的布局文件的下标


下载地址:https://github.com/xiaojinzi123/xiaojinzi-openSource-base/tree/master/xiaojinzi/base/android/adapter/listView


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值