嵌套的RecyclerView动态数据加载

时间:2017-10-14 13:06:36

标签: java android android-recyclerview scrollview nestedscrollview

我的一个活动中有一个嵌套在scrollView中的RecyclerView。

我为回收商实施了动态数据加载,这样当剩下x个可见对象时,它会自动发出API调用以获取下一个项目。

由于某种原因,嵌套在滚动视图中取消了这一点。实际上,当活动开始时,我实际上有几个API调用,可能是因为滚动视图包装了回收器的内容,并且回收器包装了自己的内容。无论如何这对我来说是不好的,更糟糕​​的是当我向下滚动回收内容时不会进行进一步的动态加载。

我确实通过使用NestedScrollView和recycler.setNestedScrollingEnabled(false)来修复错误的滚动行为。

我不能将我想要的回收器视图上的内容与回收器一起作为回收器布局中的静态标头滚动,因为它不是静态内容,而是其他2个回收站和其他一些我需要活动的东西有控制权。

任何想法?

1 个答案:

答案 0 :(得分:0)

现在已经很晚了但你可以尝试添加一个OnScrollListener即使嵌套RecyclerView它总是适用于我:

public class MainActivity extends AppCompatActivity {

private static final String TAG = MainActivity.class.getSimpleName();
private List<Movie> movies;
private RecyclerView recyclerView;
private GridLayoutManager gridLayout;
private MoviesAdapter adapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    movies = new ArrayList<>();
    getMoviesFromDB(0);

    gridLayout = new GridLayoutManager(this, 2);
    recyclerView.setLayoutManager(gridLayout);

    adapter = new MoviesAdapter(this, movies);
    recyclerView.setAdapter(adapter);

    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

            if (gridLayout.findLastCompletelyVisibleItemPosition() == movies.size() - 1) {
                getMoviesFromDB(movies.get(movies.size() - 1).getId());
            }

        }
    });
}

private void getMoviesFromDB(int id) {

    AsyncTask<Integer, Void, Void> asyncTask = new AsyncTask<Integer, Void, Void>() {
        @Override
        protected Void doInBackground(Integer... movieIds) {

            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url("http://192.168.1.35/movies.php?id=" + movieIds[0])
                    .build();
            try {
                Response response = client.newCall(request).execute();

                JSONArray array = new JSONArray(response.body().string());

                for (int i = 0; i < array.length(); i++) {

                    JSONObject object = array.getJSONObject(i);

                    Movie movie = new Movie(object.getInt("id"), object.getString("movie_name"),
                            object.getString("movie_image"), object.getString("movie_genre"));

                    MainActivity.this.movies.add(movie);
                }


            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            adapter.notifyDataSetChanged();
        }
    };

    asyncTask.execute(id);
}}

有了这个,只有当用户滚动时,api呼叫才会检查更多。就像在Google Play商店中一样。