【发布时间】:2020-10-21 06:04:23
【问题描述】:
当我开始输入我的android.widget.SearchView 时,我能够找到输入文本的匹配项,并看到我的Filter 来自我的Adapter,它扩展了BaseAdapter,确实找到了结果,但是,我在输入时实际上并没有看到建议的列表。
这是我所拥有的:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuItem searchItem = menu.add(Menu.NONE, R.id.search_card, 1, R.string.search_card);
searchItem.setIcon(R.drawable.search);
searchItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
LinearLayout searchLayout = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.search_view, null);
SearchView searchView = searchLayout.findViewById(R.id.searchVieww);
searchItem.setActionView(searchView);
//this will be a dynamic list in the end, but just wanna get it to work first...
List<ListViewItem> suggestionList = new ArrayList<>();
suggestionList.add(new ListViewItem("abc", "123"));
suggestionList.add(new ListViewItem("apple", "345"));
ListViewAdapter adapter = new ListViewAdapter(suggestionList);
ListView listView = searchLayout.findViewById(R.id.searchViewList);
listView.setAdapter(adapter);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String word) {
searchCardsForWord(word.trim());
searchView.setIconified(true); //first call to clear search bar
searchView.setIconified(true); //second call to close search bar
return true;
}
@Override
public boolean onQueryTextChange(String word) {
adapter.getFilter().filter(word);
Log.d("DEBUG", "query text filter: " + adapter.getCount());// the count of this is NOT zero when I type in 'a'
return false;
}
});
...adding other MenuItems
return true;
}
适配器
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import com.boredofnothing.flashcard.databinding.ListViewItemBinding;
import java.util.ArrayList;
import java.util.List;
public class ListViewAdapter extends BaseAdapter implements Filterable {
private List<ListViewItem> itemList;
private List<ListViewItem> itemListFull;
private LayoutInflater inflater;
ListViewAdapter(List<ListViewItem> itemList) {
this.itemList = itemList;
itemListFull = new ArrayList<>(itemList);
}
@Override
public int getCount() {
return itemList.size();
}
@Override
public ListViewItem getItem(int position) {
return itemList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Filter getFilter() {
return filter;
}
private Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<ListViewItem> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(itemListFull);
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for (ListViewItem item : itemListFull) {
if (item.getText1().toLowerCase().contains(filterPattern)
|| item.getText2().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
itemList.clear();
itemList.addAll((List) results.values);
notifyDataSetChanged();
}
};
@Override
public View getView(int position, View convertView, final ViewGroup parent) {
if (inflater == null) {
inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
ListViewItemBinding listViewItemBinding = ListViewItemBinding.inflate(inflater);
listViewItemBinding.textView1.setText(itemList.get(position).getText1());
listViewItemBinding.textView2.setText(itemList.get(position).getText2());
return listViewItemBinding.getRoot();
}
}
search_view.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:focusableInTouchMode="true"
android:orientation="vertical">
<SearchView
android:id="@+id/searchVieww"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:queryHint="Input word to search"></SearchView>
<ListView
android:id="@+id/searchViewList"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:padding="8dp"
android:scrollbars="none" />
</LinearLayout>
list_view_item.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
app:cardCornerRadius="4dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="4dp">
<TextView
android:id="@+id/text_view1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:textColor="@android:color/black"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/text_view2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/text_view1"
android:layout_marginStart="8dp"
android:textSize="15sp" />
</RelativeLayout>
</android.support.v7.widget.CardView>
在选择 SearchView 之前:
选择 SerachView 后:
输入“a”后:
最后,如果输入的单词/字符匹配或包含在我的suggestionList 中,我希望看到Cardviews 中的ListView。
【问题讨论】:
-
你能发布你的 ListViewAdapter 吗?你是如何在你的适配器中实现过滤器的?
-
@Gautam 我更新了我的帖子。过滤器只是检查输入的单词/字符是否存在于现在硬编码的列表中(这最终将是一个动态列表,但我只是想让它先工作)
-
如何将 search_view 添加到您的活动中?我假设此布局未绑定到您的活动 LinearLayout searchLayout = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.search_view, null);您必须将其添加到您的活动布局中才能显示结果
标签: android android-listview searchview baseadapter