Text not showing in searchview widget android -
ive setup searchview widget in actionbar filter out entries in listview uses customadapter. reason however, no text shows in search widget when start typing. when collapse search widget, soft keyboard still shows up. i've included relevant classes , methods below.
public class mainwithtab extends actionbaractivity { static context appcontext; static mainwithtab me; customadapter adapter ; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); appcontext = getapplicationcontext(); me = this; // set action bar. final actionbar actionbar = getactionbar(); actionbar.setnavigationmode(actionbar.navigation_mode_tabs); // each of sections in app, add together tab action bar. actionbar.addtab(actionbar.newtab().settext("songs").settablistener(this)); actionbar.addtab(actionbar.newtab().settext("radio").settablistener(this)); } public mainwithtab gettheone() { homecoming me; } public context getcontext() { homecoming appcontext; } @override public boolean oncreateoptionsmenu(menu menu) { getmenuinflater().inflate(r.menu.main, menu); // associate searchable configuration searchview searchmanager searchmanager = (searchmanager) getsystemservice(context.search_service); searchview searchview = (searchview) menu.finditem(r.id.action_search) .getactionview(); searchview.setsearchableinfo(searchmanager .getsearchableinfo(getcomponentname())); searchview.onquerytextlistener querytextlistener = new searchview.onquerytextlistener() { @override public boolean onquerytextchange(string newtext) { adapter = new articlefragment().getmainadapter(); adapter.getfilter().filter(newtext); homecoming true; } @override public boolean onquerytextsubmit(string query) { adapter = new articlefragment().getmainadapter(); adapter.getfilter().filter(query); system.out.println("adapter= " + adapter); homecoming true; } }; searchview.setonquerytextlistener(querytextlistener); homecoming true; } @override public boolean onoptionsitemselected(menuitem item) { switch (item.getitemid()){ case r.id.action_search:system.out.println("search!");break; } // system.out.println("search!"); homecoming true; }}
then fragment has listview:
public class articlefragment extends listfragment { viewgroup v; static arraylist<listmodel> customlistviewvaluesarr = new arraylist<listmodel>(); articlefragment articlefragment = null; static customadapter mainadapter; @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { if(customlistviewvaluesarr.size()==0) { new getsongs().execute(); }else { resources res = getresources(); customadapter adapter = new customadapter(getactivity(), customlistviewvaluesarr, res); setlistadapter(adapter); } articlefragment = this; homecoming super.oncreateview(inflater, container, savedinstancestate); } public customadapter getmainadapter(){ homecoming mainadapter; } @override public void onactivitycreated(bundle savedinstancestate) { super.onactivitycreated(savedinstancestate); } public arraylist<jsonobject> getsongobjs() { homecoming songobjs; } private class getsongs extends asynctask<void, void, void> { @override protected void doinbackground(void... arg0) { gets listview items here!..code not included works! homecoming null; } protected void onpreexecute() { } protected void onpostexecute(void unused) { if (getactivity() != null) { //* ******* take model object in arraylist **********//* resources res = getresources(); customadapter adapter = new customadapter(getactivity(), customlistviewvaluesarr, res); //setadapter mainadapter =adapter; setlistadapter(adapter); getlistview().settextfilterenabled(true); } } } }
customadapter:
/** * ******** declare used variables ******** */ private activity activity; private arraylist<listmodel> data; private arraylist<listmodel> datafilter; private layoutinflater inflater = null; public resources res; listmodel tempvalues = null; public static arraylist<viewholder> views = new arraylist<viewholder>(); private valuefilter valuefilter; mainwithtab mainwithtab = new mainwithtab(); /** * ********** customadapter constructor **************** */ public customadapter(){ } public customadapter(activity a, arraylist d, resources reslocal) { /********** take passed values **********/ activity = a; info = d; datafilter = d; res = reslocal; //this.articlefragment = articlefragment; /*********** layout inflator phone call external xml layout () ***********/ inflater = (layoutinflater) activity. getsystemservice(context.layout_inflater_service); } @override public filter getfilter() { if(valuefilter==null) { valuefilter=new valuefilter(); } homecoming valuefilter; } private class valuefilter extends filter { //invoked in worker thread filter info according constraint. @override protected filterresults performfiltering(charsequence constraint) { filterresults results = new filterresults(); if (constraint != null && constraint.length() > 0) { arraylist<listmodel> filterlist = new arraylist(); for(int i=0;i<datafilter.size();i++){ if((datafilter.get(i).getsongname().touppercase()) .contains(constraint.tostring().touppercase())) { listmodel listmodel = new listmodel(); listmodel =datafilter.get(i); filterlist.add(listmodel); }else if((datafilter.get(i).getsongartiste().touppercase()) .contains(constraint.tostring().touppercase())){ listmodel listmodel = new listmodel(); listmodel =datafilter.get(i); filterlist.add(listmodel); } } results.count=filterlist.size(); results.values=filterlist; } else { results.count=datafilter.size(); results.values=datafilter; } homecoming results; } @override protected void publishresults(charsequence constraint, filterresults results) { data=(arraylist<listmodel>) results.values; notifydatasetchanged(); } } }
androidmanifest:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.seed.app"> <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <activity android:name=".mainwithtab" android:label="@string/app_name" android:hardwareaccelerated="true" android:screenorientation="portrait" > <intent-filter> <action android:name="android.intent.action.search"/> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> </application> <uses-permission android:name="android.permission.internet" /> <uses-permission android:name="android.permission.access_network_state" /> <uses-permission android:name="android.permission.read_phone_state"></uses-permission>
menu/main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.seed.app.mainwithtab" > <!-- search / display --> <item android:id="@+id/action_search" android:icon="@android:drawable/ic_menu_search" android:title="@string/action_search" app:actionviewclass="android.widget.searchview" app:showasaction="ifroom"/> </menu>
**update**
so got search widget work 1 time without alter in code. got text show in unable duplicate 1 time again , have no thought changed. going through logcat, realised every single time seek type search widget unregisterirlistener() called. ideas?
in mainwithtab can this
menuitem item = menu.finditem(r.id.action_search); searchview searchview = new searchview(getactivity().getactionbar().getthemedcontext()); menuitemcompat.setactionview(item, searchview); searchview.setonquerytextlistener(new onquerytextlistener() { @override public boolean onquerytextsubmit(string query) { // todo auto-generated method stub system.out.println("search query submit"); homecoming false; } @override public boolean onquerytextchange(string newtext) { system.out.println("tap"); youradapter ca = (youradapter)listview.getadapter(); if (textutils.isempty(newtext)) { system.out.println("isempty"); //listview.cleartextfilter(); //option 1 ca.getfilter().filter(null); //option 2 } else { ca.getfilter().filter(newtext); //option 2 //listview.setfiltertext(newtext); //option 1 } homecoming true; } });
then in adapter add together code
@override public filter getfilter() { homecoming new filter() { @suppresswarnings("unchecked") @override protected void publishresults(charsequence constraint, filterresults results) { // have inform adapter new list filtered if (results.count == 0) notifydatasetinvalidated(); else { yourlist = (arraylist<example>)results.values; notifydatasetchanged(); } } @override protected filterresults performfiltering(charsequence constraint) { final filterresults oreturn = new filterresults(); if (constraint == null || constraint.length() == 0) { // no filter implemented homecoming list oreturn.values = yourlistcopy; oreturn.count = yourlistcopy().size; } else { final arraylist<example> result = new arraylist<example>(); if(yourlistcopy != null && yourlistcopy.size() > 0) { (int = 0; < yourlistcopy().size; i++) { if(yourlistcopy.get(i) .getname() .touppercase()) { result.add(yourlistcopy.get(i)); } } } oreturn.values = result; oreturn.count = result.size(); } homecoming oreturn; } }; } public void notifydatasetchanged() { super.notifydatasetchanged(); }
android android-search
No comments:
Post a Comment