java - onClickListener on a CardView in a RecyclerView created by a Fragment in a Fragment in an Activity -
this multi-part question.
first part:
i'm building app track local events. currently, have fragment containing recyclerview consisting of cardviews each represent 1 event. want able tap card , replace fragment new 1 showing more details card's event.
i've searched google several hours, none of solutions presented seemed work when tried them. below class fragment tab1 creates recyclerview adapter.
public class tab1 extends fragment { //recyclerview private recyclerview mrecyclerview; private recyclerview.adapter madapter; private recyclerview.layoutmanager mlayoutmanager; //progressdialog private progressdialog pdialog; // url contacts json private static string url = "removed"; // json node names private static final string tag_event = "event"; private static final string tag_eventname = "event name"; private static final string tag_location = "location"; private static final string tag_rainlocation = "rain location"; private static final string tag_org = "org"; private static final string tag_time = "time"; private static final string tag_rsvp = "rsvp"; // events jsonarray jsonarray events = null; private list<event> eventlist; private recyclerview rv; @override public view oncreateview(layoutinflater inflater, @nullable viewgroup container, @nullable bundle savedinstancestate) { view v =inflater.inflate(r.layout.tab_2,container,false); // calling async task json new getevents().execute(); return v; } public void onviewcreated(view view, bundle savedinstancestate) { mrecyclerview = (recyclerview) getview().findviewbyid(r.id.my_recycler_view); mrecyclerview.sethasfixedsize(true); mlayoutmanager = new linearlayoutmanager(getactivity()); mrecyclerview.setlayoutmanager(mlayoutmanager); } private class getevents extends asynctask<void, void, void> { @override protected void onpreexecute() { super.onpreexecute(); // showing progress dialog pdialog = new progressdialog(getactivity()); pdialog.setmessage("please wait..."); pdialog.setcancelable(false); pdialog.show(); } @override protected void doinbackground(void... arg0) { // creating service handler class instance servicehandler sh = new servicehandler(); // making request url , getting response string jsonstr = sh.makeservicecall(url, servicehandler.get); log.d("response: ", "> " + jsonstr); if (jsonstr != null) { try { eventlist = new arraylist<>(); jsonobject jsonobj = new jsonobject(jsonstr); // getting json array node events = jsonobj.getjsonarray(tag_event); // looping through events (int = 0; < events.length(); i++) { jsonobject c = events.getjsonobject(i); string eventname = c.getstring(tag_eventname); string location = c.getstring(tag_location); string rain = c.getstring(tag_rainlocation); string org = c.getstring(tag_org); string time = c.getstring(tag_time); simpledateformat format = new simpledateformat("eee, mmm d, h:mm a", locale.us); simpledateformat parsersdf = new simpledateformat("yyyy-mm-dd hh:mm:ss", locale.us); try { date date = parsersdf.parse(time); time = format.format(date); } catch (parseexception e) { e.printstacktrace(); } string rsvp = c.getstring(tag_rsvp); eventlist.add(new event(eventname, time.touppercase(), location, r.drawable.pace)); } } catch (jsonexception e) { e.printstacktrace(); } } else { log.e("servicehandler", "couldn't data url"); } return null; } @override protected void onpostexecute(void result) { super.onpostexecute(result); // dismiss progress dialog if (pdialog.isshowing()) pdialog.dismiss(); rvadapter adapter = new rvadapter(eventlist); mrecyclerview.setadapter(adapter); } } } and here rvadapter
public class rvadapter extends recyclerview.adapter<rvadapter.eventviewholder> { public static class eventviewholder extends recyclerview.viewholder implements view.onclicklistener { cardview cv; textview eventname; textview eventtime; textview eventlocation; imageview orgphoto; private clicklistener clicklistener; eventviewholder(view itemview) { super(itemview); cv = (cardview)itemview.findviewbyid(r.id.cv); eventname = (textview)itemview.findviewbyid(r.id.event_name); eventtime = (textview)itemview.findviewbyid(r.id.event_time); eventlocation = (textview)itemview.findviewbyid(r.id.event_location); orgphoto = (imageview)itemview.findviewbyid(r.id.org_photo); itemview.setonclicklistener(this); } public interface clicklistener { /** * called when view clicked. * * @param v view clicked * @param position of clicked item */ public void onclick(view v, int position, string title); } /* setter listener. */ public void setclicklistener(clicklistener clicklistener) { this.clicklistener = clicklistener; } @override public void onclick(view v) { clicklistener.onclick(v, getposition(), eventname.gettext().tostring()); } } list<event> events; rvadapter(list<event> events){ this.events = events; } @override public void onattachedtorecyclerview(recyclerview recyclerview) { super.onattachedtorecyclerview(recyclerview); } @override public eventviewholder oncreateviewholder(viewgroup viewgroup, int i) { view v = layoutinflater.from(viewgroup.getcontext()).inflate(r.layout.event_card, viewgroup, false); eventviewholder pvh = new eventviewholder(v); return pvh; } @override public void onbindviewholder(eventviewholder eventviewholder, final int i) { eventviewholder.eventname.settext(events.get(i).name); eventviewholder.eventtime.settext(events.get(i).time); eventviewholder.eventlocation.settext(events.get(i).location); eventviewholder.orgphoto.setimageresource(events.get(i).orgphoto); eventviewholder.setclicklistener(new eventviewholder.clicklistener() { @override public void onclick(view v, int pos, string title) { //onclick } }); } @override public int getitemcount() { return events.size(); } } you can see i've attempted implement interface , onclicklistener. right way? i've tried test making toasts name of card clicked, doesn't appear have worked, or @ least toast not showing up.
second part:
if correct way , should working, where/how write code replace fragment new 1 showing more information event? can go in adapter class? tab1 fragment inside of fragment inside of activity. i'd replace tab1's parent fragment.
see if helps
public class rvadapter extends recyclerview.adapter<rvadapter.eventviewholder> { public static class eventviewholder extends recyclerview.viewholder implements view.onclicklistener { cardview cv; textview eventname; textview eventtime; textview eventlocation; imageview orgphoto; eventviewholder(view itemview) { super(itemview); cv = (cardview) itemview.findviewbyid(r.id.cv); eventname = (textview) itemview.findviewbyid(r.id.event_name); eventtime = (textview) itemview.findviewbyid(r.id.event_time); eventlocation = (textview) itemview.findviewbyid(r.id.event_location); orgphoto = (imageview) itemview.findviewbyid(r.id.org_photo); } @override public void onclick(view view) { //do stuff } } list<event> events; rvadapter(list<event> events){ this.events = events; } @override public void onattachedtorecyclerview(recyclerview recyclerview) { super.onattachedtorecyclerview(recyclerview); } @override public eventviewholder oncreateviewholder(viewgroup viewgroup, int i) { view v = layoutinflater.from(viewgroup.getcontext()).inflate(r.layout.event_card, viewgroup, false); return new eventviewholder(v); } @override public void onbindviewholder(eventviewholder eventviewholder, final int i) { eventviewholder.eventname.settext(events.get(i).name); eventviewholder.eventtime.settext(events.get(i).time); eventviewholder.eventlocation.settext(events.get(i).location); eventviewholder.orgphoto.setimageresource(events.get(i).orgphoto); } @override public int getitemcount() { return events.size(); } } for 2nd part of question. better parentactivity hosting both frag1 & frag2 switch fragment. in parentactivity, there framelayout (r.id.container) hosting frag1.
you can pass event call activity, , can replace fragment in container
getsupportfragmentmanager() .begintransaction() .replace(r.id.container, frag2) .commit();
Comments
Post a Comment