【问题标题】:How to fix load duplicate data in Android如何修复在 Android 中加载重复数据
【发布时间】:2016-10-31 06:03:57
【问题描述】:

我想从服务器加载数据并显示到RecyclerView,对于连接库我使用Retrofit。在我的应用程序中,我检查互联网连接!如果连接加载数据,则显示其他布局。
我的代码:

boolean isConnected = ConnectivityReceiver.isConnected();
...

private void loadDataCheckNet() {
    loadData(isConnected);
}

private void loadData(boolean isConnect) {

    if (isConnect) {
        Retrofit_ApiInterface apiInterface = Retrofit_ApiClient.getClient().create(Retrofit_ApiInterface.class);
        Call<R_SearchModelResponse> call = apiInterface.getSearchResponse(searchText);

        call.enqueue(new Callback<R_SearchModelResponse>() {
            @Override
            public void onResponse(Call<R_SearchModelResponse> call, Response<R_SearchModelResponse> response) {
                if (response != null) {
                    models.addAll(response.body().getPosts());
                    mAdapter.notifyDataSetChanged();
                    if (mAdapter.getItemCount() > 0) {
                        search_recycler.setAdapter(mAdapter);
                        searchLoadLayout.setVisibility(View.GONE);
                    } else {
                        empty_layout.setVisibility(View.VISIBLE);
                        searchLoadLayout.setVisibility(View.GONE);
                    }
                } else {
                    searchLoadLayout.setVisibility(View.VISIBLE);
                    TastyToast.makeText(context, "Error", TastyToast.LENGTH_LONG, TastyToast.ERROR);
                }

                mAdapter.notifyDataSetChanged();
                searchCheckNet.setVisibility(View.GONE);
            }

            @Override
            public void onFailure(Call<R_SearchModelResponse> call, Throwable t) {
                Log.e("CatResponseError", "Error : " + t);
            }
        });
    } else {
        searchCheckNet.setVisibility(View.VISIBLE);
        if (mAdapter != null) {
            mAdapter.clear();
            search_recycler.setAdapter(mAdapter);
        }
        searchCheckNetButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mAdapter.notifyDataSetChanged();
                loadDataCheckNet();
            }
        });
    }
}

当运行应用程序和isConnected到互联网应用程序是好的,加载数据非常好!但是当断开互联网并再次连接时,从服务器加载数据并再次重复!
例如:如果你有 3 个帖子,post#1,post#2,post#3 当连接到互联网时再次加载这三个帖子!帖子#1,帖子#2,帖子#3,帖子#1,帖子#2,帖子#3。

我该如何解决这个问题?谢谢大家

【问题讨论】:

    标签: android retrofit2 android-json gson


    【解决方案1】:

    您只需将此 models.clear(); 添加到您的公共 void onResponse 方法中。

    @Override
                    public void onResponse(Call<R_SearchModelResponse> call, Response<R_SearchModelResponse> response) {
                        if (response != null) {
                            models.clear();
                            models.addAll(response.body().getPosts());
                            mAdapter.notifyDataSetChanged();
                            if (mAdapter.getItemCount() > 0) {
                                search_recycler.setAdapter(mAdapter);
                                searchLoadLayout.setVisibility(View.GONE);
                            } else {
                                empty_layout.setVisibility(View.VISIBLE);
                                searchLoadLayout.setVisibility(View.GONE);
                            }
    

    【讨论】:

    • Thnx @Mohammad,什么是 diffrance adapter.clear();与模型.clear(); ?
    • adapter 是一个包含视图组(AdapterView)和模型(我读过here)的组件,清除模型将从列表中删除数据。这里的模型是指列表中的数据@Rj.Ok
    【解决方案2】:

    您只是将项目添加到 models 容器中,我认为这是某种列表,是的,您将有重复项。在向列表添加新项目之前,您应该 clear 您的列表。

    【讨论】:

      【解决方案3】:

      当然,数据是重复的,因为您在列表中添加了新数据而没有清除旧数据。

      一个简单的解决方法是,添加这一行:

      models.clear();
      

      在这一行之前:

      models.addAll(response.body().getPosts());
      

      顺便说一句,你应该在 onCreate() 初始化适配器后立即设置 RecycleView 适配器,每次更新数据时一遍又一遍地为 RecycleView 设置相同的适配器是没有意义的。

      【讨论】:

        【解决方案4】:

        更新

        定义一个方法

        public void clearData() {
            //for remving list data
            int size = this.models.size();
            if (size > 0) {
                for (int i = 0; i < size; i++) {
                    this.models.remove(i);
                }
        
                this.notifyItemRangeRemoved(0, size);
            }
        }
        

        像这样调用之前的方法

        clearData();
        models.addAll(response.body().getPosts());
        

        【讨论】:

        • Thnx Emdad,但 myList 是什么?
        • @Emdad,最好的方法是先删除模型或适配器的数据,然后填充模型的数据!对于这项工作,您使用此代码:adapter.clear();model.clear();
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-02
        相关资源
        最近更新 更多