Recycler просмотр повторяющихся элементов после реализации list.clear () и adapter.notitfyDataSetChanged - PullRequest
0 голосов
/ 18 апреля 2019

Я заполняю представление переработчика из удаленной базы данных.

Вид рециркулятора внутри фрагмента.

При первой загрузке фрагмента в окне перезапуска отображаются все элементы.

Когда пользователь нажимает на элемент, загружается другой фрагмент.

Затем, если пользователь нажимает кнопку "Назад", в окне повторного просмотра отображаются все элементы, но теперь два раза. После последнего элемента все элементы отображаются снова.

Я включил эти две строки в функцию, которая загружает данные из удаленной базы данных:

    marcas.clear();// public List<Marca> marcas;
    adapter.notifyDataSetChanged();// private MarcaAdapter adapter;

Но я не так делаю?

EDIT

In OnCreate

   /**
         * Showing Swipe Refresh animation on activity create
         * As animation won't start on onCreate, post runnable is used
         */
        mSwipeRefreshLayout.post(new Runnable() {

            @Override
            public void run() {

                mSwipeRefreshLayout.setRefreshing(true);
                marcas.clear();
                adapter.notifyDataSetChanged();


            }
        });

        recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview);

        marcas = new ArrayList<>();


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

        adapter = new MarcaAdapter(getActivity(), marcas);


        recyclerView.setAdapter(adapter);
      //  marcas.clear();



        getDirectoriosFromDB(0);//LLAMADA 1

Для загрузки данных:

private void getDirectoriosFromDB(int id) {

 marcas.clear();
 adapter.notifyDataSetChanged();

    AsyncTask<Integer, Void, Void> asyncTask = new AsyncTask<Integer, Void, Void>() {
        @Override
        protected Void doInBackground(Integer... addressesIds) {
          //  Log.d("HOLA PERFIL", "UID REGISTRADO ANTES DE CARGAR REECYCLER: " + user_id);



            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url("https://...marcas_todas.php")
                    .build();
            try {
                Log.d("HOLA ADDRESSES", "DIRECCION LEIDA:cargando datos en getdirectorios INICIO ARRAY" );
                okhttp3.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);

                    Log.d("HOLA ADDRESSES", "DIRECCION LEIDA:cargando datos en getdirectorios " +array);
                    Log.d("HOLA ADDRESSES", "DIRECCION LEIDA: " + i);
                    Marca marca = new Marca(object.getInt("id_car_make"),
                            object.getString("name")

                            );

                    marcas.add(marca);
                }


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

        @Override
        protected void onPostExecute(Void aVoid) {


            adapter.notifyDataSetChanged();
            mSwipeRefreshLayout.setRefreshing(false);
        }
    };

    asyncTask.execute(id);
}

1 Ответ

0 голосов
/ 18 апреля 2019

в основном ваш список является глобальным внутри действия, но не в адаптере, поэтому, когда вы обновляете список, этот адаптер времени заполнил экземпляр массива, так что это создает проблему. Вы должны пополнить адаптер после обновления списка: как это:

mSwipeRefreshLayout.post(new Runnable() {

        @Override
        public void run() {

            mSwipeRefreshLayout.setRefreshing(true);
            marcas.clear();
            adapter = new MarcaAdapter(getActivity(), marcas);
            adapter.notifyDataSetChanged();


        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...