之前研究过并且写过一个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方法用来获取每一个实体对象该使用的布局文件的下标