【发布时间】:2014-01-10 20:31:20
【问题描述】:
我一直在尝试使用 mSearch EditText 过滤/搜索 Adapter 适配器。我正在寻求实现 getFilter() 等方面的帮助。
此活动当前正在显示内容列表。 mSearch 位于列表上方,我想在有人键入时过滤/更新列表。
如果您需要特定的代码或了解更多信息,请告诉我。提前谢谢!
public class MainActivity extends FragmentActivity {
private SearchView mSearch;
private List<Model> mMain = new ArrayList<Model>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public class MainFragment extends Fragment implements SearchView.OnQueryTextListener {
private ListView mListView;
private Adapter mAdapter;
public boolean onQueryTextChange(String query) {
if (mAdapter != null) {
mAdapter.getFilter().filter(query.toString());
}
return false;
}
public boolean onQueryTextSubmit(String query) {
onQueryTextChange(query);
return false;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.main_user_list_row, container, false);
mListView = (ListView) findViewById(R.id.listView);
mAdapter = new Adapter();
mListView.setAdapter(mAdapter);
mListView.setAdapter.setTextFilterEnabled(true);
mSearch.setOnQueryTextListener((SearchView.OnQueryTextListener) mContext);
return rootView;
}
public class Adapter extends BaseAdapter implements Filterable {
@Override
public int getCount() {
return mMain.size();
}
@Override
public Object getItem(int position) {
return 1;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = View.inflate(mContext, R.layout.main_user_list_row, null);
if (mContext != null && mMain.get(position) != null) {
TextView mPosition = (TextView) view.findViewById(R.id.position);
mPosition.setText("...");
}
return view;
}
@Override
public Filter getFilter() {
return new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mMain = (List<Model>) results.values;
Adapter.this.notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Contest> filteredResults = getFilteredResults(constraint);
FilterResults results = new FilterResults();
results.values = filteredResults;
return results;
}
};
}
}
}
我在 getFilteredResults
收到此错误Cannot resolve method 'getFilteredResults(java.lang.CharSequence)'
我也在 mSearch.setOnQueryTextListener((SearchView.OnQueryTextListener) mContext);
处收到此错误FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{...MainActivity}: java.lang.ClassCastException: ...InDraftActivity cannot be cast to android.widget.SearchView$OnQueryTextListener
java.lang.ClassCastException: ...MainActivity cannot be cast to android.widget.SearchView$OnQueryTextListener
解决方案
我通过在活动中实现 OnQueryTextListener 而不是片段来修复 SearchView 错误。
执行过滤需要看起来像
List<Contest> filteredResults = new ArrayList<Contest>();
FilterResults results = new FilterResults();
results.values = filteredResults;
results.count = filteredResults.size();
查看标记的答案。
【问题讨论】:
-
什么是getFilteredResults,你定义了吗?因为我之前实现过这种代码,从来没有用过那种方法
-
我删除了 getFilteredResults,现在 mMain.size() 在 publishResults 期间返回为 null。
-
好吧,如果您删除了该方法,那么现在分配给
filteredResults的是什么?不是空的吗? -
您的活动是否实现了 OnQueryTextListener?
-
@Submersed,活动没有。 MainFragment 实现 SearchView.OnQueryTextListener
标签: java android listview searchview