我在我的操作栏中设置了一个搜索视图小部件,以简单地过滤掉我的列表视图中使用自定义适配器的条目。然而,由于某种原因,当我开始输入时,搜索小部件中没有显示任何文本。此外,当我折叠搜索小部件时,软键盘仍然出现。我在下面包含了相关的类和方法。
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 up the action bar.
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// For each of the sections in the app, add a tab to the action bar.
actionBar.addTab(actionBar.newTab().setText("Songs").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Radio").setTabListener(this));
}
public MainWithTab getTheOne() {
return me;
}
public Context getContext() {
return appContext;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
// Associate searchable configuration with the 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);
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
adapter = new ArticleFragment().getMainadapter();
adapter.getFilter().filter(query);
System.out.println("adapter= " + adapter);
return true;
}
};
searchView.setOnQueryTextListener(queryTextListener);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.action_search:System.out.println("Search!");break;
}
// System.out.println("Search!");
return true;
}}
然后是具有 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;
return super.onCreateView(inflater, container, savedInstanceState);
}
public CustomAdapter getMainadapter(){
return Mainadapter;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
public ArrayList<JSONObject> getSongobjs() {
return songObjs;
}
private class getSongs extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
Gets Listview items here!..code not included but works!
return 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);
}
}
}
}
自定义适配器:
/**
* ******** 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;
data = d;
dataFilter = d;
res = resLocal;
//this.articleFragment = articleFragment;
/*********** Layout inflator to call external xml layout () ***********/
inflater = (LayoutInflater) activity.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public Filter getFilter() {
if(valueFilter==null) {
valueFilter=new ValueFilter();
}
return valueFilter;
}
private class ValueFilter extends Filter {
//Invoked in a worker thread to filter the data according to the 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;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
data=(ArrayList<ListModel>) results.values;
notifyDataSetChanged();
}
}
}
安卓清单:
<?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>
菜单/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 / will display always -->
<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>
**更新**
所以我终于让搜索小部件工作了一次,而我的代码没有任何变化。我得到了实际显示在其中的文本,但我无法再次复制它,我不知道发生了什么变化。通过 logcat,我意识到每次我尝试输入搜索小部件时都会调用 unregisterIRListener()。有任何想法吗?