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
Post a Comment