Android PullToRefresh处理listview的下拉刷新与上拉加载

最近公司项目需要,需要设计一个listview的下拉刷新与上拉加载的效果,在网上找到各路大神的关于listview刷新的资料,最后使用的是鸿洋大神推荐的PullToRefresh,一个简单实用的第三方Library。

这里用的是鸿洋的pulltorefresh,大家可以参考
pulltorefresh详解

刚开始加载的是最新的5条定位数据,然后上拉listview,会依次出现 向上拉加载更多,松开加载更多,正在加载,加载完成以后新添加的数据会加在已有数据的后面。
Android PullToRefresh处理listview的下拉刷新与上拉加载_第1张图片

1、布局文件
首先引入第三方的库文件base_library_pullToRefresh_chenyoca到自己的项目中去,
源码下载链接
然后直接在项目需要的地方使用即可

<com.handmark.pulltorefresh.library.PullToRefreshListView
        xmlns:ptr="http://schemas.android.com/apk/res-auto"
        android:id="@+id/pull_refresh_list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:cacheColorHint="#00000000"
        android:divider="#19000000"
        android:dividerHeight="4dp"
        android:fadingEdge="none"
        android:fastScrollEnabled="false"
        android:footerDividersEnabled="false"
        android:headerDividersEnabled="false"
        android:smoothScrollbar="true"
        ptr:ptrListViewExtrasEnabled="false"
        ptr:ptrAnimationStyle="flip"
        ptr:ptrMode="both"
        ptr:ptrScrollingWhileRefreshingEnabled="true" >
    </com.handmark.pulltorefresh.library.PullToRefreshListView>

pull-to-refresh在xml中定义的一些属性:
ptr:ptrMode=”both” ,意思:上拉和下拉都支持。
可选值为:disabled(禁用下拉刷新),pullFromStart(仅支持下拉刷新),pullFromEnd(仅支持上拉刷新),both(二者都支持),manualOnly(只允许手动触发)
ptrRefreshableViewBackground 设置整个mPullRefreshListView的背景色
ptrHeaderBackground 设置下拉Header或者上拉Footer的背景色
ptrHeaderTextColor 用于设置Header与Footer中文本的颜色
ptrHeaderSubTextColor 用于设置Header与Footer中上次刷新时间的颜色
ptrShowIndicator如果为true会在mPullRefreshListView中出现icon,右上角和右下角,挺有意思的。
ptrHeaderTextAppearance , ptrSubHeaderTextAppearance分别设置拉Header或者上拉Footer中字体的类型颜色等等。
ptrRotateDrawableWhilePulling当动画设置为rotate时,下拉是是否旋转。
ptrScrollingWhileRefreshingEnabled刷新的时候,是否允许ListView或GridView滚动。觉得为true比较好。
ptrListViewExtrasEnabled 决定了Header,Footer以何种方式加入mPullRefreshListView,true为headView方式加入,就是滚动时刷新头部会一起滚动。

2、代码里设置使用

locationLV = (PullToRefreshListView) getView().findViewById(
                R.id.pull_refresh_list);
        fragCategoryLocationAdapter = new FragCategoryLocationAdapter(context);
        locationLV.setAdapter(fragCategoryLocationAdapter);
        locationLV.setOnItemClickListener(new ItemClickEvent());
        locationLV.setOnRefreshListener(new OnRefreshListener2<ListView>() {

            @Override
            public void onPullDownToRefresh(
                    PullToRefreshBase<ListView> refreshView) {
                // TODO Auto-generated method stub
                String label = "更新于:" + Utils.getCurrentTime();
                refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
                locationLV.onRefreshComplete();
            }

            @Override
            public void onPullUpToRefresh(
                    PullToRefreshBase<ListView> refreshView) {
                // 这里写上拉加载更多的任务
                String label = "更新于:" + Utils.getCurrentTime();
                refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
                index++;
                setQueryObject();
                handler_getPositionRecord = new Handler() {
                    @Override
                    public void handleMessage(Message msg) {
                        if (msg.what == 0x133) {
                            showLocation();
                        }
                    }
                };
                locationLV.onRefreshComplete();

            }

        });

声明组件,绑定自定义的适配器,然后绑定setOnRefreshListener监听器,注意选择OnRefreshListener2()方法,因为需要同时监听上拉与下拉两个事件。然后在对应的监听事件里面处理自己的业务逻辑即可。
setLastUpdatedLabel就是显示上拉加载或者下拉刷新旁边的最后更新时间。
listview的上拉刷新加载数据其实就是数据查询的分页显示,向服务器传递参数包括两个:pagesize,每一页显示数据的数量,pageindex,要显示的当前页面。

pagesize设置为5,每次取5条数据,第一次pageindex设置为0,以后每执行一次下拉加载操作,pageindex依次加1, index++;然后开始设置参数,访问服务器,请求数据setQueryObject();

private void setQueryObject() {
        String[] mType = { "GENERAL", "REDCALL", "GREENCALL" };
        startTime = controlStartTimeTxt.getText().toString();
        endTime = controlStopTimeTxt.getText().toString();
        getPositionRecordThread = new PartnerServiceThread(
                AppConstant.GETPOSITIONRECORD, handler_getPositionRecord);
        getPositionRecordThread.setCustomerId(customerId);
        getPositionRecordThread.setType(mType[controlSpinner
                .getSelectedItemPosition()]);
        getPositionRecordThread.setStarttime(startTime);
        getPositionRecordThread.setEndtime(endTime);
        getPositionRecordThread.setPageIndex(index);
        getPositionRecordThread.setPageSize(5);
        getPositionRecordThread.start();

参数设置以后,启动线程,主线程执行handleMessage方法,解析返回的结果,并且进行显示。
我项目中用的是jsonarray,继承的是arraylist类,arraylist类的数组结构便于对集合进行快速的随机访问,缺点是向指定索引位置插入对象和删除指定索引位置对象的速度较慢。


private JSONArray jsonArrayLocation = new JSONArray();
index=0;

// 将返回的结果进行解析,并且显示给用户

    private void showLocation() {
        result = null;
        result = getPositionRecordThread.getResult();
        if (result == null || result == AppConstant.OE) {
            UiUtil.showOtherException(context);
        } else if (result == AppConstant.NE) {
            UiUtil.showNetworkException(context);
        } else {
            try {
                JSONObject jsonObj = JSONObject.fromObject(result);
                String str = jsonObj.getString("tableData");

                JSONArray jsonArrayTemp = JSONArray.fromObject(str);
                for (int i = 0; i < jsonArrayTemp.size(); i++) {
                    jsonArrayLocation.add(jsonArrayTemp.get(i));
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        fragCategoryLocationAdapter.setJsonArrayLocation(jsonArrayLocation);
        fragCategoryLocationAdapter.notifyDataSetChanged();

    }

刚开始运行的结果是每次加载的5条数据都会覆盖之前加载的5条数据,并不会添加在listview的后面。最后定义了一个成员变量private JSONArray jsonArrayLocation = new JSONArray()作为以后被添加的jsonarray,然后一个局部变量JSONArray jsonArrayTemp = JSONArray.fromObject(str)用作盛放每次上拉加载过来的数据。每加载一次,就遍历一次这个数组,然后将对应的数据通过add方法加在jsonArrayLocation 里面,最后将数据传递给适配器,并且通知适配器更新,最后调用locationLV.onRefreshComplete();方法结束上拉加载状态,数据加载完毕,达到最后的预期效果。

这里因为业务需要没有写下拉刷新的功能,其实上拉刷新就是将执行JSONArray 的clear方法,然后将pagesize设置为5,pageindex设置为0,调用setQueryObject()方法请求数据,将数据传递给适配器,通知更新,调用locationLV.onRefreshComplete()方法结束下拉刷新状态,数据加载完毕。

你可能感兴趣的:(android,ListView,数组,下拉刷新,上拉加载)