android - 如何避免 RecyclerView - Android 中的数据重复?

标签 android mongodb android-recyclerview

我正在使用 mongodb 开发壁纸应用程序。我正在从数据库中检索数据,并在 data-model 类的帮助下将其显示在我的 recyclerView 上,没有任何问题。我还使用滑动刷新布局来允许用户刷新 recyclerView 以获取新数据。

但现在的问题是如何避免数据重复并只向用户显示新帖子。我的意思是,如果在我的第一个查询中我的数据库中有 5 张图片,我会得到这 5 张,所以当用户再次刷新布局时,recyclerView 的项目增加到 10,我想避免这种情况我只想在数据库中的帖子增加到 6 个或更多时才向他们展示新图片。

我认为这种避免数据的概念也用于社交媒体应用程序。但是对于这种情况,我想知道我必须做什么?

数据模型类:

public class TimelineData {
    private String type, time, img_link;

    public TimelineData(String type, String time, String img_link) {
        this.type = type;//type means what type of wallpaper
        this.time = time;
        this.img_link = img_link;
    }


    public String getType() {
        return type;
    }

    public String getTime() {
        return time;
    }

    public String getImg_link() {
        return img_link;
    }

}

将数据添加到 recyclerview:

private List<TimelineData> timelineDataList = new ArrayList<>();

public void onCreateView() {
    recyclerview.setItemViewCacheSize(20);
    recyclerview.setDrawingCacheEnabled(true);
    recyclerview.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    recyclerview.setLayoutManager(new LinearLayoutManager(ctx));
    //Setting Adapter
    adapter=new CustomRecyclerViewAdapter(timelineDataList);
    recyclerview.setAdapter(adapter);
}

@Override
public void onStart() {
    super.onStart();
    // Fetching data from server
    socket.disconnect();
    socket.connect();

    //Getting Data from server
    JSONObject obj=new JSONObject();
    try {
        obj.put("timeline_posts","all");
        socket.emit("data",obj);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
void addTimelineData(String type,String time,String img_link) {
    timelineDataList.add(new TimelineData(type,time,img_link));
    adapter.notifyDataSetChanged();
}

private  Emitter.Listener handlePosts = new Emitter.Listener() {

    @Override
    public void call(final Object... args){
        try {
            JSONArray jsonArray=(JSONArray)args[0];
                          for(int i=0;i<jsonArray.length();i++){
                   try {
                       JSONObject ob=jsonArray.getJSONObject(i);

                       post_type=ob.getString("post_type");


                       post_time=ob.getString("time");

                       post_link=ob.getString("img_link");

                       addTimelineData(post_type,post_time,post_link);

                   } catch (JSONException e) {
                       e.printStackTrace();
                   }
               }

        } catch (Exception e) {
            Log.e("error",e.toString());
        }
    }
};

最佳答案

您可以尝试在每次获得新数据时清理数据源,这样您将始终重新插入完整的数据集,如果您有新数据,它将与旧数据一起插入,您不必担心重复移动应用程序中的数据,仅在服务器中。

 private List<TimelineData> timelineDataList=new ArrayList<>() ;
 public void onCreateView(){
    recyclerview.setLayoutManager(new LinearLayoutManager(ctx));
    //Setting Adapter
    adapter=new CustomRecyclerViewAdapter(timelineDataList);
    recyclerview.setAdapter(adapter);
  }
@Override
public void onStart() {
    super.onStart();
    // Fetching data from server
    socket.disconnect();
    socket.connect();

    //Getting Data from server
    JSONObject obj=new JSONObject();
    try {
        obj.put("timeline_posts","all");
        socket.emit("data",obj);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
void addTimelineData(String type,String time,String img_link){
     boolean isRepeated = false;
     for(TimelineData data : timelineDataList){
         if(data.getTime().equals(time)){
           isRepeated = true;
         }
     }
     if(!isRepeated){
        timelineDataList.add(new TimelineData(type,time,img_link));
     }

    adapter.notifyDataSetChanged();
}
private  Emitter.Listener handlePosts = new Emitter.Listener(){

@Override
public void call(final Object... args){
    try {
        JSONArray jsonArray=(JSONArray)args[0];
         timelineDataList.clear(); //clear data before inserting new one
                      for(int i=0;i<jsonArray.length();i++){
               try {
                   JSONObject ob=jsonArray.getJSONObject(i);

                   post_type=ob.getString("post_type");


                   post_time=ob.getString("time");

                   post_link=ob.getString("img_link");

                   addTimelineData(post_type,post_time,post_link);

               } catch (JSONException e) {
                   e.printStackTrace();
               }
           }

    } catch (Exception e) {
        Log.e("error",e.toString());
    }
}
};

关于android - 如何避免 RecyclerView - Android 中的数据重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49638838/

相关文章:

mongodb - 在 MongoDB 中按一天中的时间查询日期时间

java - ListView 适配器异步操作

java - 在 ListView 中显示 JSON 数据仅显示 Array 中的第一个元素

java - LibGDX - 尝试在我的游戏中显示可见的计时器

node.js - 具有动态引用的 Mongoose 事件模型

android - 如何知道 RecyclerView 何时完成放置项目?

android - 在 recyclerView 适配器内单击 handle 按钮

android - Cordova在android项目中添加插件很慢

php - 创建 PHP 页面的自定义响应

node.js - 流式传输数据并写入 MongoDB