java - 工具栏中的SearchView不过滤ListFragment

标签 java android android-listview android-adapter android-listfragment

我正在尝试在 Toolbar 中为 ListFragment 实现 SearchView,但由于某种原因过滤不起作用。 SearchView 和键盘显示正常,但 ListView 在我输入内容时不会被过滤。

fragment 类

public class MyFragment extends ListFragment implements SearchView.OnQueryTextListener {

    public MyFragment() {}

    private ListView lv;
    private MyListAdapter mAdapter;

    public static MyFragment newInstance() {
        return new MyFragment();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_list, container, false);
        initialize();
        return view;
    }

    List<Product> myList = new ArrayList<>();
    private void initialize() {
        String[] items = getActivity().getResources().getStringArray(R.array.product_names);
        String[] itemDescriptions = getActivity().getResources().getStringArray(R.array.product_descriptions);
        for (int n = 0; n < items.length; n++){
            Product product = new Product();
            product.setProductName(items[n]);
            product.setProductDescription(itemDescriptions[n]);
            myList.add(product);
        }

        mAdapter = new MyListAdapter(myList, getActivity());
        setListAdapter(mAdapter);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        View v = getView();

        mTwoPane = getActivity().findViewById(R.id.detail_container) != null;

        assert v != null;
        lv = v.findViewById(android.R.id.list);
        lv.setTextFilterEnabled(true);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                MyListAdapter adapter = (MyListAdapter) parent.getAdapter();
            }
        });

        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        MenuInflater mInflater = Objects.requireNonNull(getActivity()).getMenuInflater();
        mInflater.inflate(R.menu.menu_search, menu);

        MenuItem searchitem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchitem.getActionView();
        searchView.setQueryHint(Objects.requireNonNull(getContext()).getText(R.string.searchhint_productname));

        super.onCreateOptionsMenu(menu, inflater);
    }
}

适配器类

public class MyListAdapter extends BaseAdapter implements Filterable {

    private List<Product> myList;
    private List<Product> myListFull;
    private LayoutInflater mInflater;

    public MyListAdapter(List<Product> data, Context context) {
        myList = data;
        myList = new ArrayList(myList);
        myListFull = new ArrayList(myList);
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return myList.size();
    }

    @Override
    public Object getItem(int position) {
        return myList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        MyListAdapter.ViewHolder holder;

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.listitem, parent, false);
            holder = new MyListAdapter.ViewHolder();

            holder.title = convertView.findViewById(R.id.listitem_title);
            holder.description = convertView.findViewById(R.id.listitem_subtitle);

            convertView.setTag(holder);
        } else {
            holder = (MyListAdapter.ViewHolder) convertView.getTag();
        }


        Product mProduct = (Product)getItem(position);
        holder.title.setText(mProduct.getProductName());
        holder.description.setText(mProduct.getProductDescription());

        return convertView;
    }


    /**
     * View holder
     */
    static class ViewHolder {
        private TextView title;
        private TextView description;
    }

    @Override
    public Filter getFilter() {
        return exampleFilter;
    }

    private Filter exampleFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<Product> filteredList = new ArrayList<>();

            if (constraint == null || constraint.length() == 0) {
                filteredList.addAll(myListFull);
            } else {
                String filterPattern = constraint.toString().toLowerCase().trim();

                for (Product item : myListFull) {
                    if (item.getProductName().toLowerCase().contains(filterPattern)) {
                        filteredList.add(item);
                    }
                }
            }

            FilterResults results = new FilterResults();
            results.values = filteredList;

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            myList.clear();
            myList.addAll((List<Product>) results.values);
            notifyDataSetChanged();
        }
    };
}

最佳答案

您的 SearchView 上缺少 OnQueryTextListener,只需附加一个,以便适配器知道何时进行过滤:

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override public boolean onQueryTextSubmit(String query) {
        return false;
    }

    @Override public boolean onQueryTextChange(String newText) {
        mAdapter.getFilter().filter(newText);
        return true;
    }
});

关于java - 工具栏中的SearchView不过滤ListFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53421639/

相关文章:

java - LibGdx,如何处理触摸事件?

Java静态和动态绑定(bind)、重载

android - 从单独的广播接收器更新 Activity ,如何?

android - 如何从 Activity 调用 DialogFragment

android - 如何解决这个 Proguard 问题?

android - ListView 、自定义适配器和复选框

java - 无法转换迭代器

java - 检查空的 JFormattedTextField

android-listview 透明单元格问题

android - 如何删除android中的自定义 ListView 项?