PagingListView显示数据

本文介绍使用PagingListView实现列表加载更多的功能,解决了传统ListView使用setScrollListener方法时翻页不稳定的问题。通过示例代码展示了如何配置XML布局文件及Java类来实现稳定流畅的翻页效果。

解决过程:
刚开始使用的是ListView方法,采用setScrollListener的方法, 去监听ListView的滚动事件,实现向下翻页,请求下一页的数据,后来发现这种方式翻页不稳定,且容易出现连翻几页的现象,PagingListView很好的解决了这个问题。注意要用addData,而不是replaceData方法,这样才能实现往回翻页。一般情况下,listView加载更多数据,不会因为数据过多而出现crash的现象。

xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="70dp"
        android:orientation="horizontal"
        android:background="@color/footprint_text_light_gray"
        android:layout_gravity="center_vertical">


        <TextView
            android:id="@+id/tradeInfoTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:textSize="15dp"
            android:layout_marginTop="25dp"
            android:layout_marginLeft="20dp"
            android:text="全部订单"
            android:layout_alignParentLeft="true"/>



        <RelativeLayout
            android:id="@+id/trade_info_search_view"
            android:layout_width="300dp"
            android:layout_height="45dp"
            android:layout_gravity="center_vertical"
            android:background="@drawable/shop_search_view_bg"
            android:layout_marginRight="20dp"
            android:layout_marginTop="10dp"
            android:layout_alignParentRight="true">

            <com.tmall.mobile.pad.widget.mui.IconFontTextView
                android:id="@+id/trade_info_search_icon"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_alignParentLeft="true"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="6dp"
                android:gravity="center_vertical"
                android:paddingBottom="0dp"
                android:paddingTop="0dp"
                android:text="@string/iconfont_sousuo"
                android:textColor="#5F646E"
                android:textSize="24dp" />

            <SearchView
                android:id="@+id/trade_info_search_control"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_toRightOf="@id/trade_info_search_icon"
                android:iconifiedByDefault="false"
                android:inputType="textFilter"
                android:queryHint="@string/trade_search_bar_hint_text"/>

        </RelativeLayout>

    </RelativeLayout>

    <com.tmall.mobile.pagingview.PagingListView
        android:id="@+id/tradeInfoListView"
        android:listSelector="@android:color/transparent"
        android:divider="@color/tm_detail_divider"
        android:dividerHeight="@dimen/tm_detail_divider_height"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@color/White" />



    <LinearLayout
        android:id="@+id/order_empty_container"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_marginTop="220dp"
        android:orientation="vertical"
        android:layout_gravity="center_horizontal"
        />
</LinearLayout>

class:



public class OrderInfoListFragment extends TMBaseFragment implements PagingListener {
    public static final String TAG = "OrderInfoListFragment";

    private String mTitleName;
    private PagingListView tradeInfoListView;
    private TextView titleView;
    private SearchView searchView;

    private OrderInfoListAdapter mOrderInfoListAdapter;

    private static final int REQ_CODE_QUERY_ORDER_LIST = 0x00;
    private String mEventId = "all";

    List<MtopOrderQueryOrderListResponseDataBoughtListCell> mCell;
    private Context context;
    private OrderEngine mOrderEngine;
    private BasicInfo mEventInfo;
    private String mCondition;
    private PageComponent mPageComponent;

    private boolean loadMoreFromTop = false;
    private boolean loadMoreCompleteFlag = false;
    private LoadingView loadingView;
    private String searchKeyword=null;
    private long currentPage=1;
    private LinearLayout orderEmptyContainer;
    private TextView emptyTextView;


    public OrderInfoListFragment(String titleName, String eventId) {
        this.mTitleName = titleName;
        this.mEventId = eventId;
    }


    public static OrderInfoListFragment newInstance(String titleName, String eventId) {
        return new OrderInfoListFragment(titleName, eventId);
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = getActivity();

        OrderSdk.init(context, TMAppInfo.TTID, "tmallorder", "1.0");
        OrderSdk.setLogSwitcher(true);
        mOrderEngine = OrderEngine.getInstance();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.fragment_trade_record, container, false);

        titleView = (TextView) ViewHelper.findViewById(rootView, R.id.tradeInfoTitle);
        searchView = (SearchView) ViewHelper.findViewById(rootView, R.id.trade_info_search_control);
        tradeInfoListView = (PagingListView) ViewHelper.findViewById(rootView, R.id.tradeInfoListView);
        orderEmptyContainer = (LinearLayout) ViewHelper.findViewById(rootView, R.id.order_empty_container);



        //删掉searchView前面的搜索图标
        int magId = getResources().getIdentifier("android:id/search_mag_icon", null, null);
        ImageView magImage = (ImageView) searchView.findViewById(magId);
        magImage.setLayoutParams(new LinearLayout.LayoutParams(0, 0));


        View v;

        int searchPlateId = getResources().getIdentifier("android:id/search_plate", null, null);
        v = searchView.findViewById(searchPlateId);
        if (v != null) {
            v.setBackground(getResources().getDrawable(R.drawable.transparent));
        }

        int searchSrcTextId = getResources().getIdentifier("android:id/search_src_text", null, null);
        v = searchView.findViewById(searchSrcTextId);
        if (v instanceof AutoCompleteTextView) {
            AutoCompleteTextView textView = (AutoCompleteTextView) v;
            textView.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
            textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
            textView.setHintTextColor(0x4c5F646E);

        }


        mOrderInfoListAdapter = new OrderInfoListAdapter();
        tradeInfoListView.setAdapter(mOrderInfoListAdapter);

        tradeInfoListView.setPagingListener(this);
        tradeInfoListView.setCurrentPage(1);

        loadOrderData(mEventId, 1);
        loadingView = new LoadingView(getActivity());

        setOrderEmptyContainerView(loadingView);
        loadingView.start();


        emptyTextView = (TextView) inflater.inflate(R.layout.empty_text_view, null);

        titleView.setText(mTitleName);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                searchKeyword=query;
                resetOrderInfoListView();
                loadOrderData(mEventId, 1);
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                if(newText.isEmpty()) {
                    searchKeyword="";
                    resetOrderInfoListView();
                    loadOrderData(mEventId, 1);
                }
                return true;
            }
        });
        return rootView;

    }


    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
//        mEventId=TradeRecordActivity.initEventId;
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }

    public void onEventMainThread(SideBlockListItem event) {
//        this.sideBlockListItem = event;
    }

    public void onEventMainThread(TradeItemClickEvent event) {

        titleView.setText(event.itemTitle);

        mEventId = event.eventId;

        resetOrderInfoListView();
        loadOrderData(mEventId, 1);
//        loadingView.start();

       setOrderEmptyContainerView(loadingView);
        loadingView.start();

    }


    public void onEventMainThread(RefreshItemListEvent event) {
        mOrderInfoListAdapter.removeItem(event.itemViewPosition);

//        loadOrderData(mEventId, currentPage);
//        tradeInfoListView.setSelection(event.itemViewPosition+1);
    }



    public void queryOrderList(String eventId, String condition, long page) {
        if (mEventInfo == null || !mEventInfo.code.equals(eventId)) {
            List<BasicInfo> tabInfos = mOrderEngine.getTabInfos();
            if (tabInfos != null && tabInfos.size() > 0) {
                for (BasicInfo info : tabInfos) {
                    if (eventId.equals(info.code)) {
                        mEventInfo = info;
                        break;
                    }
                }
            }
        }
        mCondition = condition;
        if (!TextUtils.isEmpty(condition)) {
            mOrderEngine.searchOrder(context, mEventInfo, ""+page, condition, new QueryListListener());
        } else {
            mOrderEngine.queryOrderList(context, mEventInfo,""+page, new QueryListListener());
        }
    }


    **@Override
    public void onNextPage(long page) {
          loadMoreFromTop = false;
          loadOrderData(mEventId, page);
        currentPage=page;
          Log.d("getCurrentPage", "" + page + "   " + mPageComponent.getTotalNumber());
    }**

    private void resetOrderInfoListView() {
        tradeInfoListView.setCurrentPage(1);
        tradeInfoListView.smoothScrollToPosition(0, 0);
        mOrderInfoListAdapter.clear();

    }


    class QueryListListener implements OrderOperateCallback {

        @Override
        public void onH5(BasicInfo info, String url, boolean isCurrentViewUrl) {
            //降级时使用,直接跳转到网页
            NavigatorUtils.openH5Page(getActivity(), url);
        }

        @Override
        public void onNativeUrl(BasicInfo basicInfo, StorageComponent storageComponent, Map<String, String> map) {
            //根据code跳转到物流详情,订单详情等本地的activity
        }

        @Override
        public void onAlert(BasicInfo basicInfo, StorageComponent storageComponent, String s, String s1) {
            //确定删除?提示框
        }

        @Override
        public void onToast(BasicInfo basicInfo, StorageComponent storageComponent, String s) {
            //评价成功提示

        }

        @Override
        public void onNative(BasicInfo basicInfo, StorageComponent storageComponent, Map<String, Object> map) {
            //旺旺联系卖家等操作

        }

        @Override
        public void onMtopStart() {
        }

        @Override
        public void onMtopEnd() {

        }

        @Override
        public void onMtopSuccess(BasicInfo info, MtopResponse response, List<MainOrderCell> orderCellList, PageComponent pageComponent) {
            orderEmptyContainer.removeAllViews();

                if (!orderCellList.isEmpty()) mOrderInfoListAdapter.addMoreData(orderCellList);
                if (mOrderInfoListAdapter.isEmpty()) {
                    setOrderEmptyContainerView(emptyTextView);
            }

            mPageComponent=pageComponent;
            int pageNumber=(Integer.parseInt(String.valueOf(mPageComponent.getTotalNumber())))/
                    Integer.parseInt(String.valueOf(mPageComponent.getPageSize()));
            int lastPageItemNumber=(Integer.parseInt(String.valueOf(mPageComponent.getTotalNumber())))%
                    Integer.parseInt(String.valueOf(mPageComponent.getPageSize()));

            if(lastPageItemNumber!=0) pageNumber++;
            Log.d("pagepageNumber", "" + pageNumber);


            tradeInfoListView.setCurrentPage(Integer.parseInt(String.valueOf(mPageComponent.getCurrentPage())));
            Log.d("mOrderInfoListAdapterCount", "" + mOrderInfoListAdapter.getCount());

            tradeInfoListView.setTotalPage(pageNumber + 1);
            tradeInfoListView.finishLoading();
        }

        @Override
        public void onMtopError(BasicInfo basicInfo, MtopResponse response) {
            Toast.makeText(getActivity(),response == null ?new String("请求出错") : response.getRetMsg(),Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onMtopSystemError(BasicInfo basicInfo, MtopResponse mtopResponse) {
            onMtopError(basicInfo,mtopResponse);
        }
    }



    protected void loadOrderData(String eventId,long page) {
        String searchCondition = null;
        if (!TextUtils.isEmpty(searchKeyword)) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("itemTitle", searchKeyword);
            searchCondition = jsonObject.toJSONString();
        }
        queryOrderList(eventId, searchCondition, page);
    }


    private void setOrderEmptyContainerView(View v)
    {
        orderEmptyContainer.removeAllViews();
        orderEmptyContainer.addView(v);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值