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

如何在RecyclerView-Android中避免数据重复?,android,mongodb,android-recyclerview,Android,Mongodb,Android Recyclerview,我正在使用mongodb开发一个壁纸应用程序。我正在从数据库中检索数据,并在数据模型类的帮助下将其显示在我的回收视图上,没有任何问题。另外,我使用滑动刷新布局允许用户刷新新数据的recyclerView 但现在的问题是如何避免数据重复,只向用户显示新帖子。我的意思是,如果在我的第一次查询中,我的数据库中有5张图片,我将得到这5张图片,因此当用户再次刷新布局时,recyclerView的项目将增加到10,我想避免这种情况,我只想在数据库中的帖子增加到6张或更多时才向他们显示新图片 我认为这个数据避

我正在使用
mongodb
开发一个壁纸应用程序。我正在从数据库中检索数据,并在
数据模型
类的帮助下将其显示在我的
回收视图
上,没有任何问题。另外,我使用滑动刷新布局允许用户刷新新数据的
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 timelineDataList=new ArrayList();
public void onCreateView(){
recyclerview.setItemViewCacheSize(20);
recyclerview.setDrawingCacheEnabled(真);
recyclerview.setDrawingCacheQuality(视图.图形缓存质量高);
recyclerview.setLayoutManager(新的LinearLayoutManager(ctx));
//设置适配器
适配器=新的CustomRecycleServiceAdapter(timelineDataList);
recyclerview.setAdapter(适配器);
}
@凌驾
public void onStart(){
super.onStart();
//从服务器获取数据
socket.disconnect();
socket.connect();
//从服务器获取数据
JSONObject obj=新的JSONObject();
试一试{
obj.put(“时间线”、“全部”);
socket.emit(“数据”,obj);
}捕获(JSONException e){
e、 printStackTrace();
}
}
void addTimelineData(字符串类型、字符串时间、字符串img_链接){
添加(新的TimelineData(类型、时间、img_链接));
adapter.notifyDataSetChanged();
}
私有发射器.Listener handlePosts=新发射器.Listener(){
@凌驾
公共作废调用(最终对象…参数){
试一试{
JSONArray JSONArray=(JSONArray)args[0];

对于(int i=0;i在向墙纸列表添加新元素之前,请检查列表中是否存在具有该id的对象。如果存在,请跳过它,否则请添加它。

在向墙纸列表添加新元素之前,请检查列表中是否存在具有该id的对象。如果存在,请跳过它,否则请添加它。

您可以尝试清理数据源每当您获得新数据时,您总是会重新插入完整的数据集,如果您有新数据,它将与旧数据一起插入,您不必担心移动应用程序中的重复数据,只需在服务器中

 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());
    }
}
};
private List timelineDataList=new ArrayList();
public void onCreateView(){
recyclerview.setLayoutManager(新的LinearLayoutManager(ctx));
//设置适配器
适配器=新的CustomRecycleServiceAdapter(timelineDataList);
recyclerview.setAdapter(适配器);
}
@凌驾
public void onStart(){
super.onStart();
//从服务器获取数据
socket.disconnect();
socket.connect();
//从服务器获取数据
JSONObject obj=新的JSONObject();
试一试{
obj.put(“时间线”、“全部”);
socket.emit(“数据”,obj);
}捕获(JSONException e){
e、 printStackTrace();
}
}
void addTimelineData(字符串类型、字符串时间、字符串img_链接){
布尔值isRepeated=false;
用于(TimelineData数据:timelineDataList){
if(data.getTime().equals(time)){
isRepeated=true;
}
}
如果(!isRepeated){
添加(新的TimelineData(类型、时间、img_链接));
}
adapter.notifyDataSetChanged();
}
私有发射器.Listener handlePosts=新发射器.Listener(){
@凌驾
公共作废调用(最终对象…参数){
试一试{
JSONArray JSONArray=(JSONArray)args[0];
timelineDataList.clear();//插入新数据前清除数据

对于(int i=0;i您可以尝试在获得新数据时清理数据源,这样您将始终重新插入完整的数据集,如果您有新数据,它将与旧数据一起插入,并且您不必担心移动应用程序中的重复数据,只需在服务器中

 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());
    }
}
};
private List timelineDataList=new ArrayList();
public void onCreateView(){
recyclerview.setLayoutManager(新的LinearLayoutManager(ctx));
//设置适配器
适配器=新的CustomRecycleServiceAdapter(timelineDataList);
recyclerview.setAdapter(适配器);
}
@凌驾
public void onStart(){
super.onStart();
//从服务器获取数据
socket.disconnect();
socket.connect();
//从服务器获取数据
JSONObject obj=新的JSONObject();
试一试{
obj.put(“时间线”、“全部”);
socket.emit(“数据”,obj);
}捕获(JSONException e){
e、 printStackTrace();
}
}
void addTimelineData(字符串类型、字符串时间、字符串img_链接){
布尔值isRepeated=false;
用于(TimelineData数据:timelineDataList){
if(data.getTime().equals(time)){
isRepeated=true;
}
}
如果(!isRepeated){
添加(新的TimelineData(类型、时间、img_链接));
}
adapter.notifyDataSetChanged();
}
私有发射器.Listener handlePosts=新发射器.Listener(){
@凌驾
公共作废调用(最终对象…参数){
试一试{
JSONArray JSONArray=(JSONArray)args[0];
timelineDataList.clear();//插入新数据前清除数据

对于(int i=0;非常感谢您的时间和回答,先生。但是我如何检查这意味着这些数据在数据模型类中,而不是在arraylist中。很抱歉,我错过了这一点。那么这将意味着您需要重新实现没有数据模型的回收器视图。您是说我应该直接使用arraylist而不是数据模型吗?您可以将另一个字段(id)添加到TimelineData(因为可能您可以同时获得两张壁纸)