android - How to implement 2 different types of seperators( i.e headers) in a ListView Adapter class -
i calling adapter set of codes
madapter = new mycustomadapter(getactivity()); madapter.addseparatoritem(new contentwrapper(q.get(0).geta_name(),null)); madapter.additem(new contentwrapper(q.get(0).getas_name(), q.get(0).getdesc_art()));
consider code:
private class mycustomadapter extends baseadapter { private static final int type_item = 0; private static final int type_separator = 1; private static final int type_max_count = type_separator + 1; private arraylist<contentwrapper> mdata = new arraylist<contentwrapper>(); private layoutinflater minflater; private treeset<integer> mseparatorsset = new treeset<integer>(); public mycustomadapter(context context) { minflater = layoutinflater.from(context); } public void additem(contentwrapper value) { mdata.add(value); notifydatasetchanged(); } public void addseparatoritem(contentwrapper value) { mdata.add(value); // save separator position mseparatorsset.add(mdata.size() - 1); notifydatasetchanged(); } public contentwrapper getitem(int position) { return mdata.get(position); } @override public int getitemviewtype(int position) { return mseparatorsset.contains(position) ? type_separator : type_item; } @override public int getviewtypecount() { return type_max_count; } public int getcount() { return mdata.size(); } public long getitemid(int position) { log.v("getitemid position", ""+position); return position; } public view getview(final int position, view convertview, viewgroup parent) { viewholder holder = null; int type = getitemviewtype(position); if (convertview == null) { holder = new viewholder(); switch (type) { case type_item: convertview = minflater.inflate(r.layout.white, null); holder.textview = (textview)convertview.findviewbyid(r.id.text); break; case type_separator: convertview = minflater.inflate(r.layout.black, null); holder.textview = (textview)convertview.findviewbyid(r.id.textseparator); count++; break; } convertview.settag(holder); } else { holder = (viewholder)convertview.gettag(); } holder.textview.settext(mdata.get(position).getitem()); if (type == type_item) { holder.textview.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { alertdialog.builder builder = new alertdialog.builder(getactivity()); builder.seticon(r.drawable.ic_launcher); final string title = mdata.get(position).getitem(); builder.settitle(title); builder.setmessage(mdata.get(position).getitemdescription()); builder.setcancelable(false); builder.setpositivebutton("ok", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { dialog.dismiss(); } }); alertdialog alertdialog = builder.create(); alertdialog.setonshowlistener(new dialoginterface.onshowlistener() { @override public void onshow(dialoginterface dialog) { alertdialog alertdialog = (alertdialog) dialog; viewgroup viewgroup = (viewgroup) alertdialog.getwindow() .getdecorview(); textview textview = findtextviewwithtitle(viewgroup, title); if (textview != null) { textview.setellipsize(null); textview.setmaxheight((int) (100 * alertdialog.getcontext().getresources().getdisplaymetrics().density)); textview.setmovementmethod(new scrollingmovementmethod()); } } }); alertdialog.show(); } private textview findtextviewwithtitle(viewgroup viewgroup, string title) { (int = 0, n = viewgroup.getchildcount(); < n; i++) { view child = viewgroup.getchildat(i); if (child instanceof textview) { textview textview = (textview) child; if (textview.gettext().equals(title)) { return textview; } } else if (child instanceof viewgroup) { viewgroup vgroup = (viewgroup) child; return findtextviewwithtitle(vgroup, title); } } return null; } }); } else { holder.textview.setonclicklistener(null); } return convertview; } } public static class viewholder { public textview textview; } public boolean ontouch(view v, motionevent event) { // todo auto-generated method stub return false; }
this code display description of selected item (here type_item
) in alertdialog.
as can see type_seperator
have disabled onclick() & want add 1 more type_seperator_gray
(let gray.xml
) type seperator disabled onclick().
do need add 1 more method similar addseparatoritem(contentwrapper value)
addseparatoritemgray(contentwrapper value)
. know have add 1 more case in switch of getview() inflating gray.xml
or else should add/modify?
edit: contentwrapper holds items text description. implemented contentwrapper assign each type_item description
public class contentwrapper { private string mitem, mitemdescription; public contentwrapper(string item, string itemdescription) { mitem = item; mitemdescription = itemdescription; } public string getitem() { return mitem; } public string getitemdescription() { return mitemdescription; } }
madapter of type mycustomadapter.
the first 3-4 lines of question says addseparatoritem not have description passed null in second argument & additem have both text , description.
i want add type_gray_separator , @ specified positions in list manually like
madapter.addseparatoritemgray("hi after 1st view"); madapter.addseparatoritemgray("hi after 23rd view"); madapter.addseparatoritemgray("hi after 45 view");
the method getviewtype
should return 3 (list item + separator + gray separator). hence set type_max_count
3.
private static final int type_gray_separator = 2; private static final int type_max_count = type_gray_separator + 1;
data structure hold gray separator positions:
private treeset<integer> mgrayseparatorsset = new treeset<integer>();
method add gray separator.
public void addgrayseparatoritem(contentwrapper value) { mdata.add(value); // save separator position mgrayseparatorsset.add(mdata.size() - 1); notifydatasetchanged(); }
the method getitemviewtype
should return appropriate view based on position.
@override public int getitemviewtype(int position) { int viewtype = type_item; if(mseparatorset.contains(position)) viewtype = type_separator; else if(mgrayseparatorset.contains(position)) { viewtype = type_gray_separator; } return viewtype; }
the method getview
should handle type_gray_separator:
public view getview(final int position, view convertview, viewgroup parent) { // existing code switch(type) { // existing cases case type_gray_separator: // inflate appropriate view break; } // existing code }
Comments
Post a Comment