【问题标题】:Nested RecyclerView dynamic data loading嵌套 RecyclerView 动态数据加载
【发布时间】:2017-10-14 13:06:35
【问题描述】:

我有一个 RecyclerView 嵌套在我的一个活动的滚动视图中。

我为回收器实现了动态数据加载,因此当留下 x 个可见对象时,它会自动发出 API 调用以获取下一个项目。

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

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

我不能在 recyclerView 上方种植我想要与回收器一起滚动的内容作为回收器布局中的静态标题,因为它不是静态内容,而是 2 个其他回收器和一堆其他我需要我的活动的东西有控制权。

有什么想法吗?

【问题讨论】:

    标签: java android android-recyclerview scrollview nestedscrollview


    【解决方案1】:

    这已经晚了,但您可以尝试添加一个 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 store。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多