PullToRefreshExpandableListView的用法
来源:互联网 发布:非农数据软件 编辑:程序博客网 时间:2024/04/30 15:56
转载请标明出处!
先放上效果图
整体用法和PullToRefreshListView差不多,但有些细节是它独有的,而且貌似还有个bug需要注意。下面进入正题:
主要有三步:1、布局文件;2、Activity;3、Adapter。
1、布局文件:
<com.handmark.pulltorefresh.library.PullToRefreshExpandableListView xmlns:ptr="http://schemas.android.com/apk/res-auto" android:id="@+id/epLv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/head_cont" android:divider="@null" ptr:ptrShowIndicator="false" //将一级菜单头部的图标去掉 ptr:ptrMode="both"/> //设置刷新的方式 <!--ptr:ptrHeaderBackground="@android:color/darker_gray"-->//设置刷新时提示部分的背景颜色 <!--ptr:ptrHeaderTextColor="@android:color/white"-->//设置刷新时提示部分的字体颜色 <!--ptr:ptrAnimationStyle="rotate"-->//设置刷新时提示部分的动画风格
2、Activity:
2.1、需继承自ExpandableListActivity
public class MyBillActivity extends ExpandableListActivity {}
2.2、声明必要的变量
/** * 现金流水列表 */ private PullToRefreshExpandableListView mPtrExpandableLv = null; /** * 一级菜单数据源 */ private List<String> mParents = null; /** * 二级菜单数据源 */ private Map<String, List<BillEntity.CommissionHistoryList.BillInfo>> mChildren = null; /** * 适配器 */ private BillAdapter mAdapter = null;
2.3、初始化PullToRefreshExpandableListView及对其进行基本的设置
mPtrExpandableLv = (PullToRefreshExpandableListView) findViewById(R.id.epLv); mPtrExpandableLv.getRefreshableView().setGroupIndicator(null);//将一级菜单头部的图标去掉
// 设置列表下拉刷新时的加载提示 this.mPtrExpandableLv.getLoadingLayoutProxy(true, false).setPullLabel("下拉刷新..."); this.mPtrExpandableLv.getLoadingLayoutProxy(true, false).setRefreshingLabel("正在刷新..."); this.mPtrExpandableLv.getLoadingLayoutProxy(true, false).setReleaseLabel("松开刷新..."); // 设置列表上拉加载时的加载提示 this.mPtrExpandableLv.getLoadingLayoutProxy(false, true).setPullLabel("上拉加载..."); this.mPtrExpandableLv.getLoadingLayoutProxy(false, true).setRefreshingLabel("正在加载..."); this.mPtrExpandableLv.getLoadingLayoutProxy(false, true).setReleaseLabel("松开加载更多...");
2.4、设置刷新监听
// 刷新时 mPtrExpandableLv.setOnRefreshListener(newPullToRefreshBase.OnRefreshListener<ExpandableListView>() { @Override public void onRefresh(PullToRefreshBase<ExpandableListView> refreshView) { //下拉时执行的操作 if (PullToRefreshBase.Mode.PULL_FROM_START == refreshView.getCurrentMode()) { HttpHelper.GetDataListInfo( "CommissionHistory", 0, "{'userid':" + "'" + mUserId + "'" + "}", mHandler, HANDLER_GET_BILL_INFO); //上拉时执行的操作 } else if (PullToRefreshBase.Mode.PULL_FROM_END == refreshView.getCurrentMode()) { int count = 0; //将拿到的数据的总数拿出来 for (String s : mParents) { count += mChildren.get(s).size(); } //获取加载更多Index参数 int index = UIOperationUtility.calculateIndex(count); HttpHelper.GetDataListInfo( "CommissionHistory", index, "{'userid':" + "'" + mUserId + "'" + "}", mHandler, HANDLER_ADD_BILL_INFO); } } });
2.5、配置Adapter。 注意:是用Activity配置上Adapter
/** * UI异步处理对象 */ class InnerHandler extends Handler { @Override public void handleMessage(Message msg) { //下拉刷新时 //当拿到现金流水数据后 if (msg.what == HANDLER_GET_BILL_INFO) { String json = (String) msg.obj; //拿取一级菜单的数据(现金流水日期) mParents = HttpResolveUtility.resolveParentDate(json); //拿取二级菜单的数据(现金流水具体数据) mChildren = HttpResolveUtility.resolveBillInfo(json); //显示数据 mAdapter = new BillAdapter(mParents, mChildren, MyBillActivity.this); MyBillActivity.this.setListAdapter(mAdapter);//注意此处是用Activity配置上Adapter //设置二级菜单默认打开 int groupCount = mPtrExpandableLv.getRefreshableView().getCount(); for (int i=0; i<groupCount; i++) { mPtrExpandableLv.getRefreshableView().expandGroup(i); }; //停止下拉刷新动画 mPtrExpandableLv.onRefreshComplete(); //上拉加载时 } else if (msg.what == HANDLER_ADD_BILL_INFO) { String json = (String) msg.obj; //拿取新加载的一级菜单数据 List<String> addedParents = HttpResolveUtility.resolveParentDate(json); //遍历新拿到的数据,如果不包含于原来的一级菜单数据源,那么将它加进去 for (String str : addedParents) { if (!mParents.contains(str)) { mParents.add(str); } } //拿取新加载的二级菜单数据 Map<String, List<BillEntity.CommissionHistoryList.BillInfo>> addedChildren = HttpResolveUtility.resolveBillInfo(json); //将新拿到的数据里的键值对都拿出来 Set<Map.Entry<String, List<BillEntity.CommissionHistoryList.BillInfo>>> sets = addedChildren.entrySet(); //迭代每一个键值对 Iterator<Map.Entry<String, List<BillEntity.CommissionHistoryList.BillInfo>>> iterator = sets.iterator(); while (iterator.hasNext()) { Map.Entry<String, List<BillEntity.CommissionHistoryList.BillInfo>> entry = iterator.next(); //如果本来的二级菜单的Map不包含这条键值对的Key,直接将这个键值对放入Map if (!mChildren.containsKey(entry.getKey())) { mChildren.put(entry.getKey(), entry.getValue()); } //如果本来的二级菜单的Map包含这条键值对的Key,那么将这条键值对的value(List集合)追加到原本已有键值对的value后面 if (mChildren.containsKey(entry.getKey())) { mChildren.get(entry.getKey()).addAll(entry.getValue()); } } //加载更多(方法内部就是notifyDataSetChanged()) mAdapter.update(mParents, mChildren); //二级菜单默认打开 int groupCount = mPtrExpandableLv.getRefreshableView().getCount(); for (int i = 0; i < groupCount; i++) { mPtrExpandableLv.getRefreshableView().expandGroup(i); } //停止上拉刷新动画 mPtrExpandableLv.onRefreshComplete(); } else { Toast.makeText(MyBillActivity.this, getString(R.string.http_connect_timeout), Toast.LENGTH_SHORT).show(); } } }
3、Adapter。注意:它的getChildrenCount(int groupPosition)方法貌似是有BUG的,用时它会自动调用不合法的参数,我是加了个判断将其规避。
public class BillAdapter extends BaseExpandableListAdapter {//需继承自BaseExpandableListAdapter /** * 一级菜单数据源 */ List<String> parents = null; /** * 二级菜单数据源 */ Map<String, List<BillEntity.CommissionHistoryList.BillInfo>> map = null; /** * 上下文对象 */ Context context = null; /** * 适配器构造方法 * * @param parents * @param map * @param context */ public BillAdapter(List<String> parents, Map<String, List<BillEntity.CommissionHistoryList.BillInfo>> map, Context context) { super(); this.parents = parents; this.map = map; this.context = context; } @Override public int getGroupCount() { return parents.size(); } @Override public int getChildrenCount(int groupPosition) { //规避框架自动调用不合法参数的错误 if(groupPosition>=parents.size()){ return 0; } String key = parents.get(groupPosition); int size = map.get(key).size(); return size; } @Override public Object getGroup(int groupPosition) { return parents.get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { String key = parents.get(groupPosition); return (map.get(key).get(childPosition)); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return true; } /** * 编写一级菜单的视图 * * @param groupPosition * @param isExpanded * @param convertView * @param parent * @return */ @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.item_bill_list_head, null); } TextView tv = (TextView) convertView .findViewById(R.id.bill_date); tv.setText(parents.get(groupPosition)); return convertView; } /** * 编写二级菜单的视图 * * @param groupPosition * @param childPosition * @param isLastChild * @param convertView * @param parent * @return */ @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { String key = parents.get(groupPosition); BillEntity.CommissionHistoryList.BillInfo info = map.get(key).get(childPosition); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.item_bill_list_cont, null); } TextView tvBillName = (TextView) convertView .findViewById(R.id.bill_name); tvBillName.setText("订单" + " " + info.getName()); String amount = info.getAmount(); TextView tvMoney = (TextView) convertView .findViewById(R.id.bill_money); if (amount.charAt(0) == '-') { tvMoney.setText(amount); } else { tvMoney.setText("+" + amount); } ; TextView tvCode = (TextView) convertView .findViewById(R.id.bill_code); tvCode.setText(info.getCode()); TextView tvBillSource = (TextView) convertView .findViewById(R.id.bill_source); tvBillSource.setText(info.getOpReason()); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { // TODO Auto-generated method stub return true; } /** * 列表加载更多列表加载更多 * @param parents 更改后的一级数据源 * @param map 更改后的二级数据源 */ public void update(List<String> parents, Map<String, List<BillEntity.CommissionHistoryList.BillInfo>> map) { this.parents = parents; this.map = map; notifyDataSetChanged(); } }
0 0
- PullToRefreshExpandableListView的用法
- (VIEW控件)PullToRefreshExpandableListView的用法
- PullToRefreshExpandableListView的点击事件
- 使用PullToRefreshExpandableListView不能setAdapter的问题
- pulltorefresh中PullToRefreshExpandableListView使用适配器的一些问题
- PullToRefreshExpandableListView 和BaseExpandableListAdapter
- PullToRefreshExpandableListView在Fragment中应用
- Android PullUpToRefresh刷新框架之PullToRefreshExpandableListView
- ?的用法
- ?的用法
- ---" ~ " 的用法---
- ---" ~ " 的用法---
- ~ 的用法
- 的用法
- ##的用法
- ##的用法
- 的用法
- ${ }的用法
- android vsnc 工作原理
- ZZULIOJ (1913: 小火山的计算能力)
- mysql系列之1.mysql基础
- android listview 分割线问题
- 通过节点,获取数据
- PullToRefreshExpandableListView的用法
- minikube 安装
- 动态更改textview的字体大小
- Hadoop笔记六之Hdfs的基本shell操作
- iOS设置[self.navigationItem setTitleView:View]
- 【zzuli】1905: 小火山的跳子游戏
- java中Date.getTime() BUG-2016-08-10
- QT多线程
- POJ 2778-DNA Sequence(AC自动机+构建邻接矩阵+矩阵快速幂)