【问题标题】:Is there any way to load 5 - 10 items in recyclerview at a time instead of 50k?有没有办法一次在 recyclerview 中加载 5 - 10 个项目而不是 50k?
【发布时间】:2016-11-15 08:49:32
【问题描述】:

我必须显示世界机场列表,用户必须选择其中一个。所以我做了一个recyclerview:

    RecyclerView recyclerView = (RecyclerView)rootView.findViewById(R.id.recyclerview);
    SearchView searchView = (SearchView)rootView.findViewById(R.id.searchview);

    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    final AirportAdapter adapter = new  AirportAdapter(airports,getActivity());
    recyclerView.setAdapter(adapter);
    adapter.notifyDataSetChanged();

其中airportsList<Airport>。问题是它加载 20 秒的时间来为 recyclerview 中的完整列表收费,当我尝试搜索任何项目时它是如此缓慢。所以我想加载20个机场,然后在用户滚动recyclerview时加载其他机场。有没有办法做到这一点?我也想这样做,因为使用 searchview 的搜索也有点慢,我想让它快一点。我以为 notifyDataSetChanged() 预加载它但它不起作用......

编辑:这是从 Realm 中检索我的列表的方法:

 final RealmResults<AirportR> airps = realm.where(AirportR.class).findAll();
 airports = realm.copyFromRealm(airps, 0);

感谢您的回答...

【问题讨论】:

标签: android performance android-recyclerview adapter


【解决方案1】:

【讨论】:

  • 如果商品没有被收费,searchview 会发生什么?
【解决方案2】:

您可以使用分页概念。

分页:是将一个文档分成多个页面的过程。

我使用的分页如下:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            LinearLayoutManager linearLayoutManager= (LinearLayoutManager) recyclerView.getLayoutManager();


    /*countToShowLoadButton here is total number of items available to 
    *user after no. of page requests. So when total visible item would 
    *reach to the end (i.e. countToShowLoadButton-3) then a "load more"
    *button would appear and it will call a new request loadMoreData
    */

            if(linearLayoutManager.findLastVisibleItemPosition() > countToShowLoadButton-3 && currentPageNumber < totalPageNumber){
                loadMoreButton.setVisibility(View.VISIBLE);
                loadMoreButton.setEnabled(true);
            }
            super.onScrolled(recyclerView, dx, dy);
        }
    });

加载更多数据:

public void loadMoreData(View view){
    getAllData(currentPageNumber+1);
}

getAllData:

public void getAllData(int pageNo){

    progressBar.setVisibility(View.VISIBLE);

    final String key = sharedPreferences.getString("Auth_key",null);

    String pageNumber = String.valueOf(pageNo);

    checkInternet = new InternetConnectivityChecker(getApplicationContext());

    if(checkInternet.isOnline()) {

        StringRequest stringRequest = new StringRequest(Request.Method.GET,
                URL_string.api_url +"?"+pageNumber,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Log.i("Result", "Success \n" + response);

                        try {
                            JSONObject responseJSON = new JSONObject(response);

                            JSONArray dataPart = responseJSON.getJSONArray("data");
                            JSONObject metaPart = responseJSON.getJSONObject("meta").getJSONObject("pagination");

//Here it updates all the variable so that when user clicks on "load more" 
// button again then it loads the data from new page

                            currentPageNumber = metaPart.getInt("current_page");
                            totalPageNumber = metaPart.getInt("total_pages");
                            totalNumberOfData = metaPart.getInt("total");
                            perPageItems = metaPart.getInt("per_page");
                            dataAtShownPage = metaPart.getInt("count");
                            countToShowLoadButton = perPageItems * currentPageNumber;


//Here it adds new data to the shown page of the app
                            prepareValueWithServerData(dataPart,dataAtShownPage);


                        } catch (Exception e) {
                            Toast.makeText(getApplicationContext(),noNetConnMessage,Toast.LENGTH_LONG).show();
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(),noNetConnMessage,Toast.LENGTH_LONG).show();
            }
        }) {

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> header = new HashMap<>();
                header.put("Authorization", "Bearer " + key);
                return header;
            }
        };

        RequestQueue requestQueue = Volley.newRequestQueue(this);
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        requestQueue.add(stringRequest);

        if(stringRequest.getTimeoutMs() > DefaultRetryPolicy.DEFAULT_TIMEOUT_MS*2){
            requestQueue.stop();
            Toast.makeText(getApplicationContext(),noNetConnMessage,Toast.LENGTH_LONG).show();
            progressBar.setVisibility(View.INVISIBLE);
        }

    } else {
        Toast.makeText(getApplicationContext(),"Please Check Internet Connection",Toast.LENGTH_LONG).show();
    }

}

PrepareValueWithServerData:

public void prepareValueWithServerData(JSONArray data, int count){

    progressBar.setVisibility(View.INVISIBLE);

    for(int i=0; i<count; i++){
        try {
            JSONObject singleItem = data.getJSONObject(i);
            item_details a = new item_details(details_1,details_2,..);
            list.add(a);


 //notifying adapter that data has been changed in the list
            adapter.notifyDataSetChanged();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

注意:服务器必须根据页数返回数据,即分页概念将用于服务器端编程,因此它不会一次返回 50K 数据,否则它应该只返回10-20左右的数据根据​​请求的页面。它会让您的应用运行得更快。

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    相关资源
    最近更新 更多