ListView в SearchView не отображается - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь реализовать функциональность 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>
...