Как я могу предотвратить запуск прокрутки в повторном окне при загрузке большего количества данных? - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь создать ленту новостей, используя просмотры карт, перечисленные в обзоре переработчика.Проблема в том, что, когда я загружаю больше данных с помощью прокрутки, они автоматически прокручиваются вверх страницы.Я хочу знать, как я могу предотвратить это.

Я переопределил onScrolled метод Recyclerview onScrollListener, чтобы загрузить больше данных.Я добавляю новые данные в Arraylist каждый раз с моей функцией fetchingJSON().Затем я вызываю функцию setupRecycler() для установки Recyclerview с моим обновленным Arraylist.

Итак, допустим, что я загрузил 4 новости в начале, затем прокрутил до конца страницы и загрузил еще 4 новости.Это просто добавление новых данных в Arraylist и повторное создание recyclerview.Я думаю, поэтому вначале нет большой разницы в установке 8 новостей. Но я не знаю, что делать, чтобы избежать этого.

/*Here I am controlling if user has reached to bottom of page, and calling fetchingJSON() function.*/

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                int visibleItemCount = lManager.getChildCount();
                int totalItemCount = lManager.getItemCount();
                int firstVisibleItemPosition = lManager.findFirstVisibleItemPosition();


                if ((visibleItemCount + firstVisibleItemPosition) >= totalItemCount
                        && firstVisibleItemPosition >= 0
                        && totalItemCount >= PAGE_SIZE && !isLoading) {

                    newsFeed.this.postPage++;
                    fetchingJSON();

                }
            }
        });

Затем в функции fetchingJSON () я вызываю функцию parseJSONData дляразбор ответа.Я не делаю этого в onResponse, потому что асинхронная операция залпа вызывает некоторые проблемы

private void fetchingJSON() {
        isLoading = true;
        String url = getResources().getString(R.string.haberUrl); 
        StringRequest jsonStringRequest = new StringRequest(
                Request.Method.POST, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        parseJSONData(response);
                    }

                },
                new Response.ErrorListener() {
                    @Override
                .
                .
                .

В функции parseJSONData;Я получаю данные из ответа JSON, устанавливая атрибуты моего объекта с этим.Чем добавление моего объекта в Arraylist.Наконец, я вызываю функцию setupRecycler для повторного создания моего Recyclerview с обновленными данными.

public void parseJSONData(String response) {

        try {
            JSONObject obj = new JSONObject(response);
            JSONArray dataArray = obj.getJSONArray("data");


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

                JSONObject dataobj = dataArray.getJSONObject(i);

                haberModel1.setTitle(dataobj.getString("header"));
                haberModel1.setUrl(dataobj.getString("picture"));
                haberModel1.setId(dataobj.getString("id"));
                haberModelArrayList.add(haberModel1);
                setupRecycler();
            }

        } catch (JSONException e) {
            Log.d(""+TAG,e.printStackTrace() );
        }
    }
private void setupRecycler() {
        lManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(lManager);
        rvAdapter = new RvAdapter(this, haberModelArrayList);
        recyclerView.setAdapter(rvAdapter);
        isLoading = false;
    }

1 Ответ

1 голос
/ 31 мая 2019

Если rvAdapter не равно нулю, добавьте к нему элементы и вызовите notifyItemRangeInserted() вместо создания нового адаптера:

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

            JSONObject dataobj = dataArray.getJSONObject(i);

            haberModel1.setTitle(dataobj.getString("header"));
            haberModel1.setUrl(dataobj.getString("picture"));
            haberModel1.setId(dataobj.getString("id"));
            haberModelArrayList.add(haberModel1);
            // remove line: setupRecycler();
        }
        // Add these lines
        if (rvAdapter != null){
            int itemCount = rvAdapter.getItemCount();
            // TODO: add method setItems() to your adapter
            rvAdapter.setItems(haberModelArrayList);
            rvAdapter.notifyItemRangeInserted(itemCount, dataArray.length());
        } else {
            setupRecycler();
        }
...