簡體   English   中英

如何使進度條在列表視圖的底部顯示更多頁腳?

[英]how to make show more footer with progressbar at bottom of listview?

我有一個包含listview的片段,其中包含來自服務器的一些數據,並且當用戶向下滾動listview時,我在listview的底部添加了進度欄頁腳,向用戶顯示了listview底部的進度條並發送服務器請求,並在listview中添加了更多數據,問題是,當滾動至結束進度條時也可見,但又發回了服務器請求。我該如何解決此問題。

這是我的列表視圖滾動的代碼

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
    if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
        Log.i("a", "scrolling stopped...");
    }
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

    if (firstVisibleItem + visibleItemCount == totalItemCount-1 && totalItemCount != 0) {
        if (!isloading) {
            // It is time to add new data. We call the listener
            isloading = true;
            if (NetworkUtil.isConnected(getActivity())) {
                m_n_DefaultRecordCount = 5;// increment of record count by 5 on next load data
                m_n_DeafalutLastCount = m_n_DeafalutLastCount + 5;// same here.....as above

                sz_RecordCount = String.valueOf(m_n_DefaultRecordCount);// convert int value to string
                sz_LastCount = String.valueOf(m_n_DeafalutLastCount);// convert int value to string /////
                loadmoreData();
            } else {
                Toast.makeText(getActivity(), "Please check internet connection !", Toast.LENGTH_LONG).show();
            }

        }
    }
}

這是我的代碼,用於在列表視圖中向用戶顯示進度條頁腳時發送請求

public void loadmoreData() {

    try {
        String json;
        // 3. build jsonObject
        final JSONObject jsonObject = new JSONObject();// making object of Jsons.
        jsonObject.put("agentCode", m_szMobileNumber);// put mobile number
        jsonObject.put("pin", m_szEncryptedPassword);// put password
        jsonObject.put("recordcount", sz_RecordCount);// put record count
        jsonObject.put("lastcountvalue", sz_LastCount);// put last count
        Log.d("CAppList:",sz_RecordCount);
        Log.d("Capplist:",sz_LastCount);
        // 4. convert JSONObject to JSON to String
        json = jsonObject.toString();// convert Json object to string

        System.out.println("Server Request:-" + json);
        requestQueue = Volley.newRequestQueue(getActivity());

        jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, CServerAPI.m_DealListingURL, jsonObject, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                System.out.println("Response:-" + response);
                try {
                    JSONArray posts = response.optJSONArray("dealList");// GETTING DEAL LIST
                    for (int i = 0; i < posts.length(); i++) {
                        JSONObject post = posts.getJSONObject(i);// GETTING DEAL AT POSITION AT I
                        item = new CDealAppDatastorage();// object create of DealAppdatastorage
                        item.setM_szHeaderText(post.getString("dealname"));//getting deal name
                        item.setM_szsubHeaderText(post.getString("dealcode"));// getting deal code
                        item.setM_szDealValue(post.getString("dealvalue"));

                        if (!s_oDataset.contains(item)) {
                            s_oDataset.add(item);
                        }
                    }
                    isloading=false;
                    m_oAdapter.notifyDataSetChanged();
                    if (response.getString("resultdescription").equalsIgnoreCase("Connection Not Available")) {//server based conditions
                        CSnackBar.getInstance().showSnackBarError(m_Main.findViewById(R.id.mainLayout), "Connection Lost !", getActivity());
                    } else if (response.getString("resultdescription").equalsIgnoreCase("Deal List Not Found")) {// serevr based conditions .....
                        CSnackBar.getInstance().showSnackBarError(m_Main.findViewById(R.id.mainLayout), "No more deals available", getActivity());
                        m_ListView.removeFooterView(mFooter);
                        requestQueue.cancelAll(TAG);
                    } else if (response.getString("resultdescription").equalsIgnoreCase("Technical Failure")) {
                        CSnackBar.getInstance().showSnackBarError(m_Main.findViewById(R.id.mainLayout), "Technical Failure", getActivity());
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                System.out.println("Error:-" + error);
                if (error instanceof TimeoutError) {
                    CSnackBar.getInstance().showSnackBarError(m_Main.findViewById(R.id.mainLayout), "Connection lost ! Please try again", getActivity());
                } else if (error instanceof NetworkError) {
                    CSnackBar.getInstance().showSnackBarError(m_Main.findViewById(R.id.mainLayout), "No internet connection", getActivity());
                }
            }
        });
        requestQueue.add(jsonObjectRequest);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

您需要做的只是維護一個用於網絡請求的標志,一個用於noMoreDataLeft的標志。

boolean noMoreDataLeft;
boolean requestGoingOn;

每次進行網絡呼叫時,只需將requestGoingOn的值更改為true。 當您通過api知道服務器上沒有更多數據時,請使noMoreDataLeft為true。

現在為顯示加載和數據行定義兩個常量-

private final static int TYPE_LOADING = 0;
private final static int TYPE_DATA = 1;

現在-

@Override
public int getItemCount() {
    return data.size() + (requestGoingOn && !isNoMoreDataLeft ? 1 : 0);
}

請求進行時,它將添加更多行。 現在,您只需要檢查當前位置是否大於data.size,然后返回type作為loading。

    @Override
    public int getItemViewType(int position) {
        return position >= data.size() ? TYPE_LOADING : TYPE_DATA;
    }

就是這樣,現在itemType將可用,因此您可以決定需要顯示哪個視圖。 希望它會有所幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM