android - refresh fragment after changing data in database -
there mainactivity
it's fragment named fragmentone
. have list of items in fragment , these data save in database
i make changes navigationview
in mainactivity
.. try delete rows database. works, after need refresh fragmentone, how can refresh fragmentone
ui ?
i have method named updateui
in fragmentone
how access method? when make method public goes wrong!
i tested different ways failed.. can tell me how can this?
mainactivity
:
public class mainactivity extends appcompatactivity { private drawerlayout mdrawerlayout; private tablayout tablayout; private viewpager viewpager; private detail mdetail; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //////// toolbar toolbar toolbar = (toolbar) findviewbyid(r.id.toolbar); setsupportactionbar(toolbar); actionbar actionbar = getsupportactionbar(); actionbar.sethomeasupindicator(r.drawable.ic_menu); actionbar.setdisplayhomeasupenabled(true); ///////// drawer mdrawerlayout = (drawerlayout) findviewbyid(r.id.drawer_layout); navigationview navigationview = (navigationview) findviewbyid(r.id.navigation_view); navigationview.setnavigationitemselectedlistener (new navigationview.onnavigationitemselectedlistener() { @override public boolean onnavigationitemselected(menuitem menuitem) { switch (menuitem.getitemid()) { case r.id.nav_item_one: return false; case r.id.nav_item_two: alertdialog.builder alert_delete = new alertdialog.builder( mainactivity.this); alert_delete.settitle("alert!"); alert_delete.setmessage(r.string.alert_delete_all); alert_delete.setpositivebutton("yes", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { detaillab.get(getapplicationcontext()).deletealldetail(); fragmentone fragmentone = new fragmentone(); fragmentone.getfragmentmanager().begintransaction().replace(r.id.card_view, fragmentone) .commit(); dialog.dismiss(); } }); alert_delete.setnegativebutton("no", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { dialog.dismiss(); } }); alert_delete.show(); return false; .. .. case r.id.nav_item_nine: finish(); default: return false; } } }); viewpager = (viewpager) findviewbyid(r.id.viewpager); setupviewpager(viewpager); tablayout = (tablayout) findviewbyid(r.id.tablayout); tablayout.setupwithviewpager(viewpager); setuptabicons(); } private void setupviewpager(viewpager viewpager) { viewpageradapter adapter = new viewpageradapter(getsupportfragmentmanager()); adapter.addfragment(new fragmentone(), "one"); adapter.addfragment(new fragmenttwo(), "two"); viewpager.setadapter(adapter); } class viewpageradapter extends fragmentpageradapter { private final list<fragment> mfragmentlist = new arraylist<>(); private final list<string> mfragmenttitlelist = new arraylist<>(); public viewpageradapter(fragmentmanager manager) { super(manager); } @override public fragment getitem(int position) { return mfragmentlist.get(position); } @override public int getcount() { return mfragmentlist.size(); } public void addfragment(fragment fragment, string title) { mfragmentlist.add(fragment); mfragmenttitlelist.add(title); } @override public charsequence getpagetitle(int position) { return null; } } @override public boolean onoptionsitemselected(menuitem item) { int id = item.getitemid(); switch (id) { case android.r.id.home: mdrawerlayout.opendrawer(gravitycompat.start); return true; } return super.onoptionsitemselected(item); } }
here method delete rows database in class called detaillab
:
public void deletealldetail() { mdatabase.delete(detailtable.name, null, null); }
and fragmentone
:
public class fragmentone extends fragment { private static final string saved_number_visible = "number"; private recyclerview mdetailrecyclerview; private detailadapter madapter; private boolean mnumbervisible; private view view; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); sethasoptionsmenu(true); } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { view = inflater.inflate(r.layout.fragment_one_layout, container, false); mdetailrecyclerview = (recyclerview) view.findviewbyid(r.id.detail_recycler_view); linearlayoutmanager layoutmanager = new linearlayoutmanager(getcontext()); layoutmanager.setreverselayout(true); //this reverse data order not scroll recyclerview last item layoutmanager.setstackfromend(true); //for keeping data order same , scrolling recyclerview last item mdetailrecyclerview.setlayoutmanager(layoutmanager); if (savedinstancestate != null) { mnumbervisible = savedinstancestate.getboolean(saved_number_visible); } updateui(); return view; } @override public void onresume() { super.onresume(); updateui(); } @override public void onsaveinstancestate(bundle outstate) { super.onsaveinstancestate(outstate); outstate.putboolean(saved_number_visible, mnumbervisible); } @override public void oncreateoptionsmenu(menu menu, menuinflater inflater) { super.oncreateoptionsmenu(menu, inflater); inflater.inflate(r.menu.fragment_one_layout, menu); menuitem numberitem = menu.finditem(r.id.show_numbers); if (mnumbervisible) { numberitem.settitle(r.string.hide_numbers); } else { numberitem.settitle(r.string.show_numbers); } } @override public boolean onoptionsitemselected(menuitem item) { switch (item.getitemid()) { case r.id.show_numbers: mnumbervisible = !mnumbervisible; getactivity().invalidateoptionsmenu(); updatenumbers(); return true; default: return super.onoptionsitemselected(item); } } private void updatenumbers() { detaillab detaillab = detaillab.get(getactivity()); int detailcount = detaillab.getdetails().size(); string number = getresources().getquantitystring (r.plurals.number_plural, detailcount, detailcount); if (!mnumbervisible) { number = null; } appcompatactivity activity = (appcompatactivity) getactivity(); activity.getsupportactionbar().setsubtitle(number); } private void updateui() { detaillab detaillab = detaillab.get(getactivity()); list<detail> details = detaillab.getdetails(); if (details.size() == 0) { textview t = (textview) view.findviewbyid(r.id.empty); t.settext(r.string.empty_view); t.setvisibility(view.visible); } else { textview t = (textview) view.findviewbyid(r.id.empty); t.setvisibility(view.gone); } // toast.maketext(getcontext(), "zero", toast.length_short).show(); if (madapter == null) { madapter = new detailadapter(details); mdetailrecyclerview.setadapter(madapter); } else { madapter.setdetails(details); madapter.notifydatasetchanged(); } updatenumbers(); } private class detailholder extends recyclerview.viewholder implements view.onclicklistener, view.onlongclicklistener { private textview mtitletextview; // private textview mdatetextview; private detail mdetail; private ratingbar mratingbar; public detailholder(layoutinflater inflater, viewgroup parent) { super(inflater.inflate(r.layout.list_item_detail, parent, false)); itemview.setonclicklistener(this); itemview.setonlongclicklistener(this); mtitletextview = (textview) itemview.findviewbyid(r.id.detail_title); // mdatetextview = (textview) itemview.findviewbyid(r.id.detail_date); mratingbar = (ratingbar) itemview.findviewbyid(r.id.ratingbar); } public void bind(detail detail) { mdetail = detail; mtitletextview.settext(mdetail.gettitle()); mratingbar.setrating(mdetail.getrate()); } @override public void onclick(view view) { intent intent = detailpageractivity.newintent(getactivity(), mdetail.getid()); startactivity(intent); } @override public boolean onlongclick(view v) { alertdialog.builder alert = new alertdialog.builder( getactivity()); alert.setmessage(r.string.alert); alert.setpositivebutton("yes", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { detaillab.get(getactivity()).deletedetail(mdetail); updateui(); updatenumbers(); dialog.dismiss(); } }); alert.setnegativebutton("no", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { dialog.dismiss(); } }); alert.show(); return true; } } private class detailadapter extends recyclerview.adapter<detailholder> { private list<detail> mdetails; public detailadapter(list<detail> details) { mdetails = details; } @override public detailholder oncreateviewholder(viewgroup parent, int viewtype) { layoutinflater layoutinflater = layoutinflater.from(getactivity()); return new detailholder(layoutinflater, parent); } @override public void onbindviewholder(detailholder holder, int position) { detail detail = mdetails.get(position); holder.bind(detail); } @override public int getitemcount() { return mdetails.size(); } public void setdetails(list<detail> details) { mdetails = details; } } }
and here layout fragmentone
:
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/fragment_one_layout"> <android.support.v7.widget.cardview android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.recyclerview android:id="@+id/detail_recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content"/> <textview android:id="@+id/empty" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="50dp" android:textalignment="center" android:textsize="20sp"/> </android.support.v7.widget.cardview> <android.support.design.widget.floatingactionbutton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentbottom="true" android:layout_alignparentright="true" android:layout_marginright="24dp" android:layout_marginbottom="24dp" android:src="@drawable/ic_menu_add" android:scaletype="center" app:elevation="8dp" app:borderwidth="0dp" />
my logcat
:
fatal exception: main process: com.drgnme.listhamrah, pid: 23454 java.lang.nullpointerexception: attempt invoke virtual method 'android.support.v4.app.fragmenttransaction android.support.v4.app.fragmentmanager.begintransaction()' on null object reference @ com.drgnme.listhamrah.mainactivity$1$1.onclick(mainactivity.java:76) @ android.support.v7.app.alertcontroller$buttonhandler.handlemessage(alertcontroller.java:161) @ android.os.handler.dispatchmessage(handler.java:102) @ android.os.looper.loop(looper.java:148) @ android.app.activitythread.main(activitythread.java:5451) @ java.lang.reflect.method.invoke(native method) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:726) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:616)
i think having issue because of below code in mainactivity:
fragmentone fragmentone = new fragmentone(); fragmentone.getfragmentmanager().begintransaction().replace(r.id.card_view, fragmentone).commit();
you try instance of fragment manager getfragmentmanager()
call activity.getfragmentmanager fragmentone
isn't attach activity method return null , java.lang.nullpointerexception
instead of fragmentone.getfragmentmanager()
use getsupportfragmentmanager()
directly activity.
hope helps.
Comments
Post a Comment