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);
}
}
}

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

转载于:https://www.cnblogs.com/lisusu/p/5251563.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值