实现list.clear()和adapter.notitfyDataSetChanged后,Recyclerview重复项

时间:2019-04-18 09:32:12

标签: android android-recyclerview

我正在从远程数据库填充回收者视图。

recyclerview位于片段中。

第一次加载片段时,recyclerview显示所有项目。

当用户单击某个项目时,将加载另一个片段。

然后,如果用户单击“后退”按钮,则recyclerview显示所有项目,但现在显示两次。在最后一个项目之后,所有项目将再次显示。

我已经在从远程数据库加载数据的函数中包括了这两行:

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

但是我做错了吗?

编辑

在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 :(得分:0)

基本上,您的列表在活动中是全局的,但在适配器中不是全局的,因此当您刷新列表时,该时间适配器已填充了arraylist实例,因此这是一个问题。您应该在刷新列表后重新填充适配器:像这样:

mSwipeRefreshLayout.post(new Runnable() {

        @Override
        public void run() {

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


        }
    });