1.聲明變量
//聲明記錄停止滾動時候,可見的位置
private int scrollPos,scrollTop;
//記錄是否展開
private HashMap<Integer, Boolean> gxmap = new HashMap<Integer, Boolean>();
2.預設展開
if(subBaseList.size()>0)
{
//設定adapter
mAdapter = new EqStateExAdapter(context, subBaseList);
lvState.setAdapter(mAdapter);
}
for (int i = 0; i < mAdapter.getGroupCount(); i++)
{
//預設記錄為已展開
gxmap.put(i, true);
//全部展開
lvState.expandGroup(i);
}
3.listview回調中處理記錄
lvState.setOnScrollListener(new AbsListView.OnScrollListener()
{
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
//滑動時記錄目前可見的位置
scrollPos = lvState.getFirstVisiblePosition();
View v1 = lvState.getChildAt(0);
scrollTop = (v1 == null) ? 0 : v1.getTop();
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount)
{}
});
lvState.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener()
{ //關閉監聽
@Override
public void onGroupCollapse(int groupPosition)
{
gxmap.put(groupPosition, false);//記錄
}
});
lvState.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener()
{ //展開監聽
@Override
public void onGroupExpand(int groupPosition)
{
gxmap.put(groupPosition, true);//記錄
}
});
4.資料更新後重新整理listview
for (int i = 0; i < mAdapter.getGroupCount(); i++)
{
if(gxmap.size()>0)
{
//根據記錄展開或關閉
Boolean isgx = gxmap.get(i);
if (isgx)
{
lvState.expandGroup(i);
}
else
{
lvState.collapseGroup(i);
}
}else{
//預設展開
lvState.expandGroup(i);
}
}
記錄.