上次我写了一篇关于自定义的HorizontalScrollView和viewpager类似tab的滑动,截图下面有listview的不同的item布局,就是在getview方法里选择type类型。如图:,其实也挺简单的,我在这里只贴出重要的方法。
先定义个listview控件,一目了然这里要分为2部分。先写一个类实现Serializable接口,定义一个关于title的属性,和一个包裹里面的内容的集合,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
public class CategoryEntity {
public static final int TITLE=0;
public static final int ITEM=1;
public Object item;
public int type;
public String section;
public CategoryEntity(Object item,int type,String section) {
this.item=item;
this.type=type;
this.section=section;
}
public Object getItem() {
return item;
}
public void setItem(Object item) {
this.item = item;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getSection() {
return section;
}
public void setSection(String section) {
this.section = section;
}
}
做完过后,我们就需要在activity里创建2个集合 List<CategoryEntity> categoryItems = new ArrayList<CategoryEntity>(); List<Listview_Time> list;
第一个集合主要是用来判断的类型是0或1,第二个集合主要是装头部和身部的所有内容,把里面的数据都获取好后,把categoryItems 传递到adapter中,这里提出2个重要的方法,也是这种效果的关键之处:
/**
* 区分Head(头)和Body(体)的逻辑处理:此方法非常关键
*/
private void initCategoryItems(List<Huobi_Listview_Time> simulateData) {
categoryItems.clear();
for (int i = 0; i < simulateData.size(); i++) {
Huobi_Listview_Time address = simulateData.get(i);
// 当前的Head
String currentTitle = address.getTitle();
// 判断上一个Head:判断是否有上一个Head,如有有则用上一个Head,如果没有则用空表示;
String lastTitle = (i - 1) >= 0 ? (simulateData.get(i - 1)
.getTitle()) : " ";
/**
* 通过对当前Head与上一个Head进行对比,如果不是同一个头,则添加进行存储
*/
if (!currentTitle.equals(lastTitle)) {
CategoryEntity firstItem = new CategoryEntity(null,
CategoryEntity.TITLE, currentTitle);
categoryItems.add(firstItem);
}
/**
* 循环添加Head下面Body,添加完当前Head的Body则会进行下一轮的Head对比,不相等则再进行新的一轮的Body的添加。
* 以此类推
*/
List<Huobi_Listview_Item> items = address.getItems();
for (Huobi_Listview_Item addressItem : items) {
CategoryEntity item = new CategoryEntity(addressItem,
CategoryEntity.ITEM, currentTitle);
categoryItems.add(item);
}
}
}
activity里把
categoryItems 数据
传递到adapter中。
在adapter里,其他的方法都类似,主要是创建2个方法:
/**
* 获得视图的类型
*/
@Override
public int getItemViewType(int position) {
return ((CategoryEntity) getItem(position)).type;
}
/**
* 获得视图的类型数量
*/
@Override
public int getViewTypeCount() {
return 2;
}
主要是在getview()里分别以int type = getItemViewType(position); //获取每一条CategoryItem数据CategoryEntity item = (CategoryEntity) getItem(position);来判断。再以switch(
type){case CategoryEntity.TITLE: 。。。。break;
case CategoryEntity.ITEM: 。。。。。break;}就这样,功能就能全部实现了。(句号表示处理的内容,分别加载头部和ITEM的容器组件,做相应的处理)。
以上就是实现Listview不同的Item加载布局,由于今天状态不好,写得比较杂乱,如有朋友遇到这类问题,可以直接联系我或留言,我会替大家解决的。qq:2037646179