Android自定义列表视图文本过滤器不起作用(Android custom listview text filter doesn't work)

我正在尝试用listview创建Android应用程序,在listview中使用item和subitem。 一切都有效,除了过滤文本。 我一直都在使用

list.setTextFilterEnabled(true);

但是当我输入内容时,列表中的所有内容都会消失。 这是我的MainActivity:

package com.macura.chatdictionary; import java.util.ArrayList; import android.os.Bundle; import android.app.Activity; import android.app.SearchManager; import android.content.Context; import android.text.TextUtils; import android.view.Menu; import android.view.MenuInflater; import android.view.inputmethod.InputMethodManager; import android.widget.ListView; import android.widget.SearchView; public class MainActivity extends Activity { public ListView lv; private CustomAdapter adapter; private ArrayList<Custom> fetch = new ArrayList<Custom>(); String[] from = new String[] { "title", "description" }; int[] to = new int[] { R.id.title, R.id.description }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Custom one = new Custom("Big1","Small1"); Custom two = new Custom("Big2","Small2"); Custom three = new Custom("Big3","Small3"); fetch.add(one); fetch.add(two); fetch.add(three); lv = (ListView) findViewById(R.id.listView1); adapter = new CustomAdapter(MainActivity.this, R.id.listView1, fetch); lv.setAdapter(adapter); lv.setTextFilterEnabled(true); } public void filterItems(String newItem){ } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_actionbar, menu); getMenuInflater().inflate(R.menu.main, menu); // Associate searchable configuration with the SearchView SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); final SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); searchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName())); final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextChange(String newText) { if (TextUtils.isEmpty(newText)) { lv.clearTextFilter(); } else { lv.setFilterText(newText); } return true; } @Override public boolean onQueryTextSubmit(String query) { InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0); return true; } }; searchView.setOnQueryTextListener(queryTextListener); return true; } }

这是我的CustomAdapter.java:

package com.macura.chatdictionary; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; public class CustomAdapter extends ArrayAdapter<Custom>{ private ArrayList<Custom> entries; private Activity activity; public CustomAdapter(Activity a, int textViewResourceId, ArrayList<Custom> entries) { super(a, textViewResourceId, entries); this.entries = entries; this.activity = a; } public static class ViewHolder{ public TextView item1; public TextView item2; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; ViewHolder holder; if (v == null) { LayoutInflater vi = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.listview_layout, null); holder = new ViewHolder(); holder.item1 = (TextView) v.findViewById(R.id.title); holder.item2 = (TextView) v.findViewById(R.id.description); v.setTag(holder); } else holder=(ViewHolder)v.getTag(); final Custom custom = entries.get(position); if (custom != null) { holder.item1.setText(custom.getcustomBig()); holder.item2.setText(custom.getcustomSmall()); } return v; }

}

这是我的Custom.java:

package com.macura.chatdictionary; public class Custom { private String customBig; private String customSmall; public Custom(String string, String string2) { this.customBig = string; this.customSmall = string2; } public String getcustomBig() { return customBig; } public void setcustomBig(String customBig) { this.customBig = customBig; } public String getcustomSmall() { return customSmall; } public void setcustomSmall(String customSmall) { this.customSmall = customSmall; } }

这是我的listview_layout.xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="20sp" android:textColor="#000000" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/description" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="15sp" android:textColor="#000000" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout>

我需要做些什么才能使过滤文本有效?

i'm trying to make Android app with listview, with item and subitem in that listview. Everything works, except for the filtering text. I've always used

list.setTextFilterEnabled(true);

but when I enter something, everything in the list disappears. Here's my MainActivity:

package com.macura.chatdictionary; import java.util.ArrayList; import android.os.Bundle; import android.app.Activity; import android.app.SearchManager; import android.content.Context; import android.text.TextUtils; import android.view.Menu; import android.view.MenuInflater; import android.view.inputmethod.InputMethodManager; import android.widget.ListView; import android.widget.SearchView; public class MainActivity extends Activity { public ListView lv; private CustomAdapter adapter; private ArrayList<Custom> fetch = new ArrayList<Custom>(); String[] from = new String[] { "title", "description" }; int[] to = new int[] { R.id.title, R.id.description }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Custom one = new Custom("Big1","Small1"); Custom two = new Custom("Big2","Small2"); Custom three = new Custom("Big3","Small3"); fetch.add(one); fetch.add(two); fetch.add(three); lv = (ListView) findViewById(R.id.listView1); adapter = new CustomAdapter(MainActivity.this, R.id.listView1, fetch); lv.setAdapter(adapter); lv.setTextFilterEnabled(true); } public void filterItems(String newItem){ } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_actionbar, menu); getMenuInflater().inflate(R.menu.main, menu); // Associate searchable configuration with the SearchView SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); final SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); searchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName())); final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextChange(String newText) { if (TextUtils.isEmpty(newText)) { lv.clearTextFilter(); } else { lv.setFilterText(newText); } return true; } @Override public boolean onQueryTextSubmit(String query) { InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0); return true; } }; searchView.setOnQueryTextListener(queryTextListener); return true; } }

This is my CustomAdapter.java:

package com.macura.chatdictionary; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; public class CustomAdapter extends ArrayAdapter<Custom>{ private ArrayList<Custom> entries; private Activity activity; public CustomAdapter(Activity a, int textViewResourceId, ArrayList<Custom> entries) { super(a, textViewResourceId, entries); this.entries = entries; this.activity = a; } public static class ViewHolder{ public TextView item1; public TextView item2; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; ViewHolder holder; if (v == null) { LayoutInflater vi = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.listview_layout, null); holder = new ViewHolder(); holder.item1 = (TextView) v.findViewById(R.id.title); holder.item2 = (TextView) v.findViewById(R.id.description); v.setTag(holder); } else holder=(ViewHolder)v.getTag(); final Custom custom = entries.get(position); if (custom != null) { holder.item1.setText(custom.getcustomBig()); holder.item2.setText(custom.getcustomSmall()); } return v; }

}

This is my Custom.java:

package com.macura.chatdictionary; public class Custom { private String customBig; private String customSmall; public Custom(String string, String string2) { this.customBig = string; this.customSmall = string2; } public String getcustomBig() { return customBig; } public void setcustomBig(String customBig) { this.customBig = customBig; } public String getcustomSmall() { return customSmall; } public void setcustomSmall(String customSmall) { this.customSmall = customSmall; } }

And this is my listview_layout.xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="20sp" android:textColor="#000000" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/description" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="15sp" android:textColor="#000000" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout>

What I have to do to make filtering text work?

最满意答案

过滤适配器

adapter.getFilter().filter("filter text", new FilterListener() { @Override public void onFilterComplete(int count) { // do some thing when filter complete } });

filter on your adapter

adapter.getFilter().filter("filter text", new FilterListener() { @Override public void onFilterComplete(int count) { // do some thing when filter complete } });

更多推荐