【问题标题】:Endless RecyclerView - ProgressBar are disappearing only when scrolling slowlyEndless RecyclerView - ProgressBar 仅在缓慢滚动时消失
【发布时间】:2016-03-22 11:40:03
【问题描述】:

我正在使用 RecyclerView 并以十个为一组从 API 中获取对象。对于分页,我使用 EndlessRecyclerOnScrollListener 并遵循本教程 Endless RecyclerView.

我的问题:滚动程序必须添加进度条并在从服务器获取数据后将其删除。但就我而言,它不起作用。进度条仍在下载。如果滚动缓慢,它就会消失。如果滚动速度更快,进度条没有消失。

获取数据的方法

private void makeJsonObjectRequest(int startList,int endList,final JsonObjectListener listener) {
            JsonArrayRequest movieReq = new JsonArrayRequest(url,
                    new Response.Listener<JSONArray>() {
                        @Override
                        public void onResponse(JSONArray response) {
                            Log.d(TAG, response.toString());
                            i = startLsit;
                            while(i < endList) {
                                try {
                                    JSONObject obj = response.getJSONObject(i);
                                    Movie movie = new Movie();

                                  /***** TONS OF CODE  *****/

                                        movieList.add(movie);
                                    }

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

                                }
                              i++;
                              lastNumber = i;
                            }
                            mAdapter.notifyDataSetChanged();
                            listener.onDone(lastNumber);
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());

                }
            });
            AppController.getInstance().addToRequestQueue(movieReq);

        }

我在片段中使用上述方法:

makeJsonObjectRequest(0, 9, new JsonObjectListener() {
                       @Override
                       public void onDone(int lastNumberI) {
                           lastNumber = lastNumberI;
                       }

                       @Override
                       public void onError(String error) {

                       }
                   }); }

   mAdapter = new RVAdapter(getContext(),movieList,this,mRecyclerView);
        mAdapter.setClickListener(this);
        mRecyclerView.setAdapter(mAdapter);

        mAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                movieList.add(null);
                mAdapter.notifyItemInserted(movieList.size()-1);
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //   remove progress item
                        movieList.remove(movieList.size()-1);
                        mAdapter.notifyItemRemoved(movieList.size());
                        //add items one by one
                        int start = lastNumber;
                        int end = start + 9;
                        makeJsonObjectRequest(start, end, new JsonObjectListener() {
                            @Override
                            public void onDone(int lastNumberI) {
                                lastNumber = lastNumberI;
                            }

                            @Override
                            public void onError(String error) {

                            }
                        });
                        mAdapter.setLoaded();
                    }
                }, 2000);
            }
        });

我的适配器是这样的Endless RecyclerView

我注意到,当我在下面重复滚动更快的代码时

mAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                movieList.add(null);
                mAdapter.notifyItemInserted(movieList.size()-1);
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //   remove progress item
                        movieList.remove(movieList.size()-1);
                        mAdapter.notifyItemRemoved(movieList.size());
                        //add items one by one
                        int start = lastNumber;
                        int end = start + 9;
                        makeJsonObjectRequest(start, end, new JsonObjectListener() {
                            @Override
                            public void onDone(int lastNumberI) {
                                lastNumber = lastNumberI;
                            }

                            @Override
                            public void onError(String error) {

                            }
                        });
                        mAdapter.setLoaded();
                    }
                }, 2000);
            }
        }); 

【问题讨论】:

  • 这段代码中你的progressDilog在哪里?
  • 能把handler.postDelayed(..., ...)的全部代码贴出来吗?
  • @AmitRanjan 你可以在这个链接中看到它android-pratap.blogspot.com/2015/06/…
  • 也许你的延迟是这里的问题。消除延迟或缩短延迟。
  • @xdevs23 会怎样?消除延迟?任何想法?我是android和java的新手。谢谢

标签: android android-recyclerview


【解决方案1】:

将它移到可运行文件之外。否则它只会在两秒钟后被删除(或者根本不会)

mAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
        @Override
        public void onLoadMore() {
            movieList.add(null);
            mAdapter.notifyItemInserted(movieList.size()-1);
            //   remove progress item
            movieList.remove(movieList.size()-1);
            mAdapter.notifyItemRemoved(movieList.size());
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {

                    //add items one by one
                    int start = lastNumber;
                    int end = start + 9;
                    makeJsonObjectRequest(start, end, new JsonObjectListener() {
                        @Override
                        public void onDone(int lastNumberI) {
                            lastNumber = lastNumberI;
                        }

                        @Override
                        public void onError(String error) {

                        }
                    });
                    mAdapter.setLoaded();
                }
            }, 2000);
        }
    }); 

【讨论】:

  • 如果我实现这个,进度条就看不到了。
  • 嗯...你为什么不在recyclerview之外创建一个progressview呢?您可以将其添加到根视图并在需要时更改可见性。一定要把它带到前面。 (.bringToFront())
猜你喜欢
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
相关资源
最近更新 更多