gpt4 book ai didi

android - 如何使用编辑文本和 SimpleCursor 适配器过滤 ListView?

转载 作者:行者123 更新时间:2023-11-30 03:34:28 25 4
gpt4 key购买 nike

不止一个人遇到过如何为使用 SimpleCursorAdapter 的 ListView 实现过滤器的问题。我遇到了这个问题,我在这个网站上找到了很多关于这个的答案。我从各处获取了一些代码,直到我最终让它工作并且它看起来更简单。

我在 youtube 上看过 Google I/O 2010 - The world of ListView 视频,它说你必须实现 getFilter 方法并在类适配器上实现 Filterable,如下所示:

public class MyListCursorAdapter extends SimpleCursorAdapter implements Filterable{

...
@Override
public Filter getFilter() {
return new Filter(){
@Override
protected FilterResults performFiltering(CharSequence charSequence){
FilterResults results = new FilterResults();

//If there's nothing to filter on, return the original data for your list
if(charSequence == null || charSequence.length() == 0){
results.values = originalData;
results.count = originalData.getCount();
}
else{

Cursor filterResultsData = null;

filterResultsData = DB.getResults(charSequence);

results.values = filterResultsData;
results.count = filterResultsData.getCount();
}

return results;
}

@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults){
filteredData = (Cursor) filterResults.values;
if (filterResults.count > 0) {
notifyDataSetChanged();
}else{
notifyDataSetInvalidated();
}
}
};
}
}

至少我是这么想的。我已经看到使用 ArrayAdapter 而不是 Cursor 效果很好。但在 Cursor 的情况下,它不起作用,至少对我来说不起作用。也许我做错了什么。所以我对做什么有点困惑。我知道我有一个编辑文本、一个 ListView ,每次在我的编辑文本上放一些文本时我都希望我的列表得到过滤。

现在我要回答我自己的问题,因为我想与您分享我的解决方案。

最佳答案

这是我所做的:

布局:

 <EditText
android:id="@+id/editTextSearch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:hint="@string/search" >
</EditText>


<ListView
android:id="@id/android:list"
android:textFilterEnabled="true"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>

注意ListView中的android:textFilterEnabled="true"

我的 ListActivity 或 ListFragment:

public class ClientesActivity extends ListFragment {

private MyListCursorAdapter myAdapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.activity_clientes, container, false);

//call to a method that fill my list
myListGetFilled(view);

//Put a listener to edit text search
EditText etSearch = (EditText) view.findViewById(R.id.editTextSearch);
etSearch.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
myAdapter.getFilter().filter(cs);

}

@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub

}

@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});


return view;
}

private void myListGetFilled(View view){

Cursor mCursor = DB.fillMyList(getActivity());

if(mCursor.getCount()>0){

String[] from = new String[] { "name", "description"};
int[] to = new int[] { R.id.textViewName, R.id.textViewDescription};

ListView myListView = (ListView) view.findViewById (android.R.id.list);

myAdapter = new MyListCursorAdapter(context, R.layout.activity_row_list, mCursor, from, to);
myListView .setAdapter(myAdapter);

}
}

最后是我的自定义光标适配器:

public class MyListCursorAdapter extends SimpleCursorAdapter implements Filterable{

...

/*THE METHOD THAT DOES THE MAGIC*/
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {

if (getFilterQueryProvider() != null){
return getFilterQueryProvider().runQuery(constraint);
}

Cursor filterResultsData = DB.getResults(constraint);
return filterResultsData;
}
}

就是这样!!

希望这对任何人都有用。如果您认为有比这个更好的解决方案,请分享!!。

关于android - 如何使用编辑文本和 SimpleCursor 适配器过滤 ListView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16846208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com