android - How to delete duplicate data that I get after updating data in firebase console -


i developing android app displays ranks of students based on marks retrieved firebase database. working fine but, when update marks in db, keeps old data , adds new data in recyclerview. can restart app refresh data. while still running, shows old data too.

below firebase data:

student1: {       c: 70,       cplus: 90,       java: 70,       name: "samson",       regno: "16sksb7034",       unix: 60        } student2: {       c: 20,       cplus: 85,       java: 68,       name: "samson",       regno: "16sksb7034",       unix: 86        } student3: {       c: 70,       cplus: 70,       java: 80,       name: "samson",       regno: "16sksb7034",       unix: 90        } 

here datamodel class:

public class marks { private string name; private string regno; private int c; private int cplus; private int  java; private int unix; private int percentage;  public marks() {}  public marks(int c, int cplus, int java, int unix) {     this.c = c;     this.cplus = cplus;     this.java = java;     this.unix = unix; }  public int getpercentage() {     return percentage; }  public void setpercentage(int percentage) {     this.percentage = percentage; }  public string getname() {     return name; }  public void setname(string name) {     this.name = name; }  public string getregno() {     return regno; }  public void setregno(string regno) {     this.regno = regno; }  public int getc() {     return c; }  public void setc(int c) {     this.c = c; }  public int getcplus() {     return cplus; }  public void setcplus(int cplus) {     this.cplus = cplus; }  public int getjava() {     return java; }  public void setjava(int java) {     this.java = java; }  public int getunix() {     return unix; }  public void setunix(int unix) {     this.unix = unix;      }   }  class markscomparator implements comparator<marks> {   @override   public int compare(marks marks1, marks marks2) {     int marks1total = marks1.getpercentage();     int marks2total = marks2.getpercentage();      if (marks2total < marks1total) {         return -1;     } else if (marks2total > marks1total) {         return 1;     } else {         return 0;     }  } } 

here's activity class:

public class marksfragment extends fragment{  private list<marks> mmarkslist = new arraylist<>();  private recyclerview mrecyclerview; private myadapter madapter; private recyclerview.layoutmanager mlayoutmanager; private firebasedatabase mdatabase; private databasereference mreference; private int total=0;      public marksfragment() {         // required empty public constructor     }      @override     public void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);     }      @override     public view oncreateview(layoutinflater inflater, viewgroup container,                              bundle savedinstancestate) {         // inflate layout fragment         view view = inflater.inflate(r.layout.fragment_marks, container, false);           mrecyclerview = (recyclerview) view.findviewbyid(r.id.recycler_view);          // use setting improve performance if know changes         // in content not change layout size of recyclerview         mrecyclerview.sethasfixedsize(true);          // use linear layout manager         mlayoutmanager = new linearlayoutmanager(getactivity());         mrecyclerview.setlayoutmanager(mlayoutmanager);          mrecyclerview.setitemanimator(new defaultitemanimator());          // specify adapter (see next example)         /*madapter = new myadapter(getcontext(),mmarkslist);         madapter.notifydatasetchanged();         mrecyclerview.setadapter(madapter);*/          //get firebase reference         firebasedatabase.getinstance().setpersistenceenabled(true);         mdatabase = firebasedatabase.getinstance();         mreference = mdatabase.getreference();          mreference.addchildeventlistener(new childeventlistener() {             @override             public void onchildadded(datasnapshot datasnapshot, string s) {                     fetchdata(datasnapshot);               }              @override             public void onchildchanged(datasnapshot datasnapshot, string s) {                     fetchdata(datasnapshot);             }              @override             public void onchildremoved(datasnapshot datasnapshot) {              }              @override             public void onchildmoved(datasnapshot datasnapshot, string s) {              }              @override             public void oncancelled(databaseerror databaseerror) {              }         });         return view;     }  public void findpercentage(marks value) {         total =value.getc() + value.getcplus() + value.getjava() + value.getunix();         value.setpercentage(total); }  private void fetchdata(datasnapshot datasnapshot) {     marks value = datasnapshot.getvalue(marks.class);     log.v("marks fragment", "" +value);     findpercentage(value);     mmarkslist.add(value);     collections.sort(mmarkslist, new markscomparator());      // specify adapter (see next example)     madapter = new myadapter(getcontext(),mmarkslist);     madapter.notifydatasetchanged();     mrecyclerview.setadapter(madapter); 

here adapter class:

public class myadapter extends recyclerview.adapter<myadapter.myviewholder>{  private context mcontext; private list<marks> markslist;   public myadapter(context mcontext, list<marks> markslist) {     this.mcontext = mcontext;     this.markslist = markslist; }  public class myviewholder extends recyclerview.viewholder {     public textview mitemname, mitemregno, mitemno, mtotal;     circleimageview mimageview;      public myviewholder(view view) {         super(view);         mitemname = (textview) view.findviewbyid(r.id.card_name);         mitemregno = (textview) view.findviewbyid(r.id.card_regno);         mitemno = (textview) view.findviewbyid(r.id.item_id);         mimageview = (circleimageview) view.findviewbyid(r.id.item_photo);         mtotal = view.findviewbyid(r.id.card_total);     } }  @override public myviewholder oncreateviewholder(viewgroup parent, int viewtype) {     view itemview = layoutinflater.from(parent.getcontext())             .inflate(r.layout.card_item, parent, false);      return new myviewholder(itemview); }  @override public void onbindviewholder(final myviewholder holder, int position) {     marks marks = markslist.get(position);     int count = position + 1;     holder.mitemname.settext("" + marks.getname());     holder.mitemregno.settext("" + marks.getregno());     holder.mitemno.settext("" + count);     holder.mimageview.setimageresource(r.drawable.after_cookie);     holder.mtotal.settext(""+ marks.getpercentage());  }  @override public int getitemcount() {     return markslist.size();         }     } 

so code intended retrieves data , calculates total , ranks students. when update data in firebase console views in recyclerview duplicates temporarily. example if update student1 unix value 10 2 views shown in recyclerview: 1 previous value , 2 updated value , again if update values yet show views representing new data without removing old views. if restart recyclerview gets refreshed , ok while running app during update shows temporary duplicate views too.

i new here , first question can't upload picture need 10 points upload photo. hope me out on this. thank in advance.

update

here link image:

when start app, image is: first image

when update unix value of student3, image in recyclerview becomes this: after updating data in firebase console

so, see adds new data keeps old data untill restart.

your problem you're never checking if student exists in mmarkslist you're duplicating him adding him again new grades.

what in case add unique id in firebase each student.

then can check in fetchdata whether student id in array, delete him , add new one.

private void fetchdata(datasnapshot datasnapshot) {     marks value = datasnapshot.getvalue(marks.class);     log.v("marks fragment", "" +value);     findpercentage(value);     // iterator.     iterator<marks> ite = mmarkslist.iterator();     while(ite.hasnext()) {         marks itevalue = ite.next();         if(itevalue.getid().equals(value.getid())) ite.remove();     }     mmarkslist.add(value);      .... } 

optionally make cleaner, can override equals , hashcode methods in marks data model, marks object considered same if id equal. more

//assuming id int  @override public int hashcode() {     return id; }  @override public boolean equals(object obj) {     if (this == obj) return true;     if (obj == null) return false;     if (this.getclass() != obj.getclass()) return false;      marks other = (marks) obj;     if (this.getid != other.getid) {         return false;     }     return true; 

}

then it's possible either use hashmap, override old student automatically or arraylist , iterate through before , check if student equals new student, this:

private void fetchdata(datasnapshot datasnapshot) {     marks value = datasnapshot.getvalue(marks.class);     log.v("marks fragment", "" +value);     findpercentage(value);     // use iterator.     iterator<marks> ite = mmarkslist.iterator();     while(ite.hasnext()) {         marks itevalue = ite.next();         if(itevalue.equals(value)) ite.remove();     }     mmarkslist.add(value);      .... } 

Comments

Popular posts from this blog

Is there a better way to structure post methods in Class Based Views -

performance - Why is XCHG reg, reg a 3 micro-op instruction on modern Intel architectures? -

jquery - Responsive Navbar with Sub Navbar -