Android中ExpandableListView如何从数据读取数据
expandablelistivew使用的数据分为两级,这两级可以没有任何关系。
提示一下:
1.一级用一套数据、二级用另外一套数据也可以,两套数据没有什么明确上的规定一定要有关系。
2.一级数据给adapter的getGroupView使用,二级数据给adapter的getChildView使用。
3.之所以糊涂是因为我们expandablelistivew使用的数据源一般都是一套数据,为了方便,二级数据会被包含在一级数据里面,在getChildView使用二级数据时,一般现货去到对应的一级数据,然后从一级数据中拿到对应的二级数据。
4.初学者为避免出错,检查一下继承adapter时,重写的一些方法返回值有没有错误,避免反悔值有误,导致显示异常,比如getCount()方法,一级是多少就返回多少,不要默认给个0或者其他错误信息的数据。
expandableListView中怎么得到其中的一个子控件
BaseExpandableListAdapter adapter = (BaseExpandableListAdapter) getAdapter(); adapter.getChildView(groupPosition, childPosition, false, null, null);
android 的ExpandableListView下面怎么样放置进度条?
1. 先弄一个TextView作为指示器放在ListView的上面,跟列表上缘平齐。
2. 处理列表的上下滚动回调:
Java代码
- if(第一行是group){
- if(第二行也是group)隐藏指示器;
- elseif(第二行是第一行展开的第一个child)显示指示器;
- }
- else{
- if(第二行是group且第一行显示不完整时)隐藏指示器;
- }
if(第一行是group){ if(第二行也是group) 隐藏指示器; else if(第二行是第一行展开的第一个child) 显示指示器; } else { if(第二行是group 且第一行显示不完整时) 隐藏指示器; }
就这样了,是吧?
Java代码
- lassGroupHeaderIndicatorextendsTextView
- implementsOnScrollListener{
- @Override
- publicvoidonScroll(AbsListViewview,intfirstVisibleItem,
- isibleItemCount,inttotalItemCount){
- //TODOAuto-generatedmethodstub
-
- ExpandableListViewlistView=(ExpandableListView)view;
- //当前第一行归属的组ID
- intgid=ExpandableListView.getPackedPositionGroup(listView.getExpandableListPosition(firstVisibleItem));
- //当前第一行的子ID
- intcid=ExpandableListView.getPackedPositionChild(listView.getExpandableListPosition(firstVisibleItem));
- //当前第二行的子ID
- intnid=ExpandableListView.getPackedPositionChild(listView.getExpandableListPosition(firstVisibleItem+1));
-
- BuddiesListAdapteradapter=(BuddiesListAdapter)listView.getExpandableListAdapter();
-
- Stringgtitle=(gid>-1)?adapter.getGroup(gid).toString():"";
- //如果第一行和第二行都是组header,不需要显示
- if(cid==-1&&nid==-1){
- this.setVisibility(View.GONE);
- }
- else{
- //当前真的是一个child,而且下一行是group
- if(nid==-1&&cid>=0){
- this.setVisibility(View.GONE);
- return;
- }
- this.setVisibility(View.VISIBLE);
- this.setText(gtitle);
- this.postInvalidate();
- }
- }
- }
public class GroupHeaderIndicator extends TextView implements OnScrollListener { @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // TODO Auto-generated method stub ExpandableListView listView = (ExpandableListView)view; //当前第一行归属的组ID int gid = ExpandableListView.getPackedPositionGroup(listView.getExpandableListPosition(firstVisibleItem)); //当前第一行的子ID int cid = ExpandableListView.getPackedPositionChild(listView.getExpandableListPosition(firstVisibleItem)); //当前第二行的子ID int nid = ExpandableListView.getPackedPositionChild(listView.getExpandableListPosition(firstVisibleItem+1)); BuddiesListAdapter adapter=(BuddiesListAdapter)listView.getExpandableListAdapter(); String gtitle=(gid>-1)?adapter.getGroup(gid).toString():""; //如果第一行和第二行都是组header,不需要显示 if(cid==-1 && nid==-1){ this.setVisibility(View.GONE); } else { //当前真的是一个child,而且下一行是group if(nid==-1 && cid>=0){ this.setVisibility(View.GONE); return; } this.setVisibility(View.VISIBLE); this.setText(gtitle); this.postInvalidate(); } } }
一切就这么简单,然后看看它放的位置是:
Xhtml代码
- <FrameLayout
- xmlns:android=" /apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
-
- android:padding="8.0dip"
- android:layout_weight="1.0">
- <ExpandableListView
- android:id="@id/buddies_list"
- android:scrollbars="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:layout_marginLeft="0.0dip"
- android:drawSelectorOnTop="false"
- android:scrollingCache="true"
- android:layout_weight="1.0"
- android:fastScrollEnabled="false"
- android:footerDividersEnabled="true"
- android:cacheColorHint="#00000000"
- android:groupIndicator="@drawable/expander_group"
- style="@style/Widget.ListViewGreen"mce_style="@style/Widget.ListViewGreen"
- />
-
- &.demo.ui.GroupHeaderIndicator
- android:id="@id/buddies_group_indicator"
- android:textColor="#333333"
- android:gravity="left|center"
- android:paddingLeft="32.0dip"
- android:layout_width="fill_parent"
- android:layout_height="44.0dip"
- android:background="@drawable/expand_group_bar"
- />
-
- </FrameLayout>
<FrameLayout xmlns:android=" /apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="8.0dip" android:layout_weight="1.0"> <ExpandableListView android:id="@id/buddies_list" android:scrollbars="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginLeft="0.0dip" android:drawSelectorOnTop="false" android:scrollingCache="true" android:layout_weight="1.0" android:fastScrollEnabled="false" android:footerDividersEnabled="true" android:cacheColorHint="#00000000" android:groupIndicator="@drawable/expander_group" style="@style/Widget.ListViewGreen" mce_style="@style/Widget.ListViewGreen" /> &.demo.ui.GroupHeaderIndicator android:id="@id/buddies_group_indicator" android:textColor="#333333" android:gravity="left|center" android:paddingLeft="32.0dip" android:layout_width="fill_parent" android:layout_height="44.0dip" android:background="@drawable/expand_group_bar" /> </FrameLayout>
我为了省事,直接从TextView中派生出这个指示器,其实你可以更复杂点,从一个ViewGroup之类的东西来做出更多的效果。
细心的朋友可以发现了,在QQ中,当上移列表时,有一个效果是下一个group header将指示器给推出屏幕的,图省事,我没这样做,留给兄弟你去扩展了。
此外,反编译QQ的代码可知,其实它的实现是自己做了一个叫 IphoneTreeView的类,继承了ExpandableListView,这样做更灵活也更好,同样,如果要实现更完美的效果,还有很多事情要做的。
ExpandableListView如何做出拉伸越界效果?
简单,你在外面包一个scroolview,然后自定义ExpandableListView,并且重写下面的方法,其他的不用管,@Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); System.out.println("expandSpec = " + expandSpec); super.onMeasure(widthMeasureSpec, expandSpec); }