adapter的getItemViewType

当界面是一个又一个的列表,就比如拿论文目录来说吧。论文的目录有每部分的标题,每部分有包含一级二级甚至更更深层级的内容。

我自己刚开始做的时候是通过listview嵌套listview的形式做的。本来想着在一个adapter的getview方法中在声明一个adapter,但是出现了listview只显示一行数据,在网上搜了个方法,在设置第二层目录之前调此方法就可以。

package com.example.tools;

import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.ListView;

public class Utility {
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}

int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}

ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}

虽然也能实现功能,但是在android 4.2.2版本中显示listItem.measure(0, 0)为空指针。

为了解决这个问题就打算通过先加载完第一部分,第一级目录,第二级目录。。。再加载第二章内容的形式。

所以,就调用了adapter的getItemViewType方法。

先拿到最外层的大数据,然后根据类型,用不同的getview显示。

int viewType = getItemViewType(position);
switch (viewType) {
case 0:
convertView = getFirstView(position, convertView, parent);
break;
case 1:
convertView = getSecondView(position, convertView, parent);
break;
case 2:
convertView = getThreadView(position, convertView, parent);
break;
在拿数据的时候,要对数据进行遍历,然后不断添加

private void addNodeToData(ArrayList<Data> Data,
Data Node) {
Data.add(Node);
if (Node.mChildrenList != null) {
for (Data childNode : Node.mChildrenList) {
addNodeToData(Data, childNode);
}
}
}

在初始化数据的时候,要调用此方法

posted @ 2016-03-07 19:13  李苏苏  阅读(1373)  评论(0编辑  收藏  举报