Styling item Views in Android ListView -
i can not figure out going wrong listview, because small. want bigger items default list views on android.
selectcontactactivity
public class selectcontactactivity extends activity { private arraylist<contact> listcontacts = new arraylist<contact>(); private arraylist<songinfo> listsong = new arraylist<songinfo>(); private listcontactsadapter adapter; private util util = new util(); private listview list; private edittext txt_search; private arraylist<contact> listsearch; private handler guithread; private runnable updatetask; @override protected void oncreate(bundle savedinstancestate) { // todo auto-generated method stub super.oncreate(savedinstancestate); this.setcontentview(r.layout.mycontacts); list = (listview)findviewbyid(r.id.list); txt_search = (edittext)findviewbyid(r.id.txt_search); final int position = this.getintent().getintextra("position", 0); listsong = util.getallsong(this); listcontacts = util.getallcontact(this); log.i("log", "size: " + listcontacts.size()); adapter = new listcontactsadapter(this, android.r.layout.simple_list_item_1, listcontacts); list.setadapter(adapter); list.settextfilterenabled(true); list.setonitemclicklistener(new onitemclicklistener() { @override public void onitemclick(adapterview<?> arg0, view arg1, int arg2, long arg3) { // todo auto-generated method stub util.assignringtonetocontact(selectcontactactivity.this, listsong.get(position), listcontacts.get(arg2)); toast.maketext( selectcontactactivity.this, "ringtone set successfully", toast.length_long).show(); finish(); } }); innitthread(); txt_search.addtextchangedlistener(new textwatcher() { @override public void ontextchanged(charsequence s, int start, int before, int count) { queueupdate(500); } @override public void beforetextchanged(charsequence s, int start, int count, int after) { } @override public void aftertextchanged(editable s) { } }); } private void queueupdate(long delaymillisecond) { guithread.removecallbacks(updatetask); // update data if no change in textsearch after time config // timer = milliseconds guithread.postdelayed(updatetask, delaymillisecond); } private void innitthread() { guithread = new handler(); updatetask = new runnable() { @override public void run() { string word = txt_search.gettext().tostring().trim(); if (word.equalsignorecase("")) { // if not change set listview first list.setadapter(new listcontactsadapter(selectcontactactivity.this, android.r.layout.simple_list_item_1, listcontacts)); } else // if txtsearch not null { // data webservice getdatabykeywords(word); // show on list listsearch = new arraylist<contact>(); // data webservice listsearch = getdatabykeywords(word); list.setadapter(new listcontactsadapter(selectcontactactivity.this, android.r.layout.simple_list_item_1, listsearch)); adapter.notifydatasetchanged(); } } }; } public arraylist<contact> getdatabykeywords(string keyword) { listsearch = new arraylist<contact>(); keyword = keyword.touppercase(); (int = 0; < listcontacts.size(); i++) { string contain = listcontacts.get(i).getname().touppercase(); if (contain.contains(keyword)) { listsearch.add(listcontacts.get(i)); } } return listsearch; } }
listcontactsadapter
public class listcontactsadapter extends arrayadapter<contact>{ private arraylist<contact> contacts; private context context; public listcontactsadapter(context context, int textviewresourceid, arraylist<contact> objects) { super(context, textviewresourceid, objects); this.context = context; this.contacts = objects; } @override public view getview(int position, view convertview, viewgroup parent) { // todo auto-generated method stub if(convertview!=null){ convertview.setbackgroundresource(r.drawable.list_selector); } textview textview = getgenericview(); textview.setbackgroundresource(r.drawable.list_selector); textview.settext(contacts.get(position).getname()); return textview; } public textview getgenericview() { // layout parameters expandablelistview abslistview.layoutparams lp = new abslistview.layoutparams( viewgroup.layoutparams.fill_parent, 70); textview textview = new textview(context); textview.setlayoutparams(lp); // center text vertically textview.setgravity(gravity.center_vertical | gravity.left); // set text starting position textview.setpadding(16, 0, 0, 0); textview.settextsize(18); textview.setshadowlayer(1, 1, 1, color.black); textview.settextcolor(0xffeeeeee); return textview; } }
mycontacts.xml
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <relativelayout android:id="@id/relativelayoutsearch" android:layout_width="fill_parent" android:layout_height="55dp" android:gravity="center_vertical" android:paddingleft="12dp" android:paddingright="12dp" > <edittext android:id="@id/txt_search" android:layout_width="fill_parent" android:layout_height="40dp" android:background="@drawable/search_bar" android:hint="@string/hint_apps_search" android:paddingbottom="12dp" android:paddingleft="45.0dip" android:paddingright="14dp" android:paddingtop="12dp" android:singleline="true" android:textsize="15.0sp" /> <button android:id="@id/button2" android:layout_width="40dp" android:layout_height="40dp" android:background="@drawable/zoomicon" /> </relativelayout> <listview android:id="@id/list" style="@style/contactlist" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@id/relativelayoutsearch" android:cachecolorhint="#e0000000" /> </relativelayout>
styles.xml
<style name="contactlist"> <!-- <item name="android:background">@color/listbg</item> --> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">fill_parent</item> <item name="android:cachecolorhint">#e0000000</item> <item name="android:divider">@color/listdiv</item> <item name="android:dividerheight">1.0dip</item> </style>
this code contact list, , here screenshot how looks, want bigger items on list. suggestions?
current listview:
i start smaller, revisiting adapter. listview simple - in activity layout, set listview match_parent
both width , height.
the adapter component creates each row, in listadapter, initiated getview()
method.
@override public view getview(int position, view convertview, viewgroup parent) { if (convertview != null) { convertview.setbackgroundresource(r.drawable.list_selector); } textview textview = getgenericview(); textview.setbackgroundresource(r.drawable.list_selector); textview.settext(contacts.get(position).getname()); return textview; }
note you're doing here incorrect; convertview
ignore it, , make new view. pattern more like:
@override public view getview(int position, view convertview, viewgroup parent) { view rowview = convertview; if (rowview == null) { rowview = // create new view represents row } // bind data rowview, return return rowview; }
which in case might be:
@override public view getview(int position, view convertview, viewgroup parent) { textview rowview = (textview) convertview; if (rowview == null) { rowview = getgenericview(); rowview.setbackgroundresource(r.drawable.list_selector); } rowview.settext(contacts.get(position).getname()); return rowview; }
see, need create rowview
if it's null. also, background needs set once (and can done in xml if want).
with creating row view, i'd recommend starting inflating layout contains single textview element.
view_item_contact.xml:
<?xml version="1.0" encoding="utf-8"?> <textview xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" />
then getgenericview()
can renamed createcontactrowview()
:
private textview createcontactrowview(viewgroup parent) { layoutinflater layoutinflater = layoutinflater.from(parent.getcontext()); return ((textview) layoutinflater.inflate(r.layout.view_item_contact, parent, false)); }
from there, can start style row in view_item_contact.xml
adding padding, setting minimum height, centering text vertically applying gravity, etc.
view_item_contact.xml:
<?xml version="1.0" encoding="utf-8"?> <textview xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:minheight="48dp" android:gravity="center_vertical" android:paddingleft="16dp" android:paddingright="16dp" android:background="@drawable/list_selector" />
in cases, avoid creating views programmatically - inflate them xml, can separate styles , layout logic.
Comments
Post a Comment