Я пытаюсь реализовать функциональность onQueryTextChange
для SearchView
, так что, когда пользователь вводит значение, будет заполнено ListView
из ListViewItem
, однако я не вижу ничего до или после того, как начать ввод значений для моего SearchView.
Вот что у меня есть:
CardFlipActivity
public abstract class CardFlipActivity extends Activity implements FragmentManager.OnBackStackChangedListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_card_flip);
...
}
@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.searchView);
searchItem.setActionView(searchView);
List<ListViewItem> suggestionList = new ArrayList<>();
suggestionList.add(new ListViewItem("abc", "123"));
suggestionList.add(new ListViewItem("apple", "345"));
ListViewAdapter adapter = new ListViewAdapter(suggestionList);
ListView searchViewList = searchLayout.findViewById(R.id.searchViewList);
searchViewList.setActivated(true);
searchViewList.setAdapter(adapter);
if (searchView != null) {
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String word) {
return true;
}
@Override
public boolean onQueryTextChange(String word) {
adapter.getFilter().filter(word);
return false;
}
});
}
...
return true;
}
ListViewAdapter
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 rowItemBinding = ListViewItemBinding.inflate(inflater);
rowItemBinding.textView1.setText(itemList.get(position).getText1());
rowItemBinding.textView2.setText(itemList.get(position).getText2());
return rowItemBinding.getRoot();
}
}
ListViewItem
public class ListViewItem {
private final String text1;
private final String text2;
public ListViewItem(String text1, String text2) {
this.text1 = text1;
this.text2 = text2;
}
public String getText1() {
return text1;
}
public String getText2() {
return text2;
}
}
search_view. xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<SearchView
android:id="@+id/searchView"
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>