在列表视图中实施搜索

时间:2018-07-29 04:12:12

标签: java android

我正在使用PDF阅读器。我已经创建了一个列表视图,其中将保存您移动设备中所有的PDF文件。

现在,当我使用EditText字段对此列表视图执行搜索时,问题是它无法正确搜索文件,例如,我有5个文件名为 sample.pdf,resume-sample.pdf,resume sample.pdf,resume.pdf,sampleresume.pdf。

现在,如果我搜索:

  1. “样本”,我将得到以下结果:sample.pdf并恢复sample.pdf

  2. “恢复”,我将得到以下结果:resume sample.pdf和resume.pdf

我们可以看到这并不是我们期望的确切结果,它应该列出其中包含“ sample”或“ resume”的所有文件。

仅当两个单词分开且两个单词之间有空格时才可以搜索,如果两个单词之间没有空格或_或-,则无法读取第二个单词。

请让我知道是否有可能对我的问题进行完美的搜索,谢谢。

这是我的EditText侦听器的代码:

search.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence a, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence a, int start, int before, int count) {
            pdf.arradapter.getFilter().filter(a.toString());
        }

        @Override
        public void afterTextChanged(Editable a) {
        }
    });

1 个答案:

答案 0 :(得分:0)

您可以改用搜索视图。只需创建一个包含以下内容的menu.xml文件

<item
    android:id="@+id/search_icon"
    android:icon="@android:drawable/ic_menu_search"
    android:title="@string/search"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always|collapseActionView" />

在活动中添加菜单

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.your_menu_name, menu);
    return true;
}

对您的活动实施SearchView.OnQueryTextListener()

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id. search_icon:
                SearchView searchView = (SearchView) item.getActionView();
                searchView.setInputType(InputType.TYPE_CLASS_TEXT);
                searchView.setQueryHint("PLACEHOLDER");
                searchView.setOnQueryTextListener(this)
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

您可以在onQueryTextChange(String newText)方法中操作列表

@Override
public boolean onQueryTextSubmit(String query) {
       return false;
}

@Override
public boolean onQueryTextChange(String newText) {
       newText = newText.toLowerCase();
       List<Item> newTransaction = new ArrayList<>();
       for (Item item : getData()) {
            String name = item.getItem_name().toLowerCase();
            if (name.contains(newText))
                newTransaction.add(item);
            }
            adapter.setFilters(newTransaction);
            return true;
      }
}

Adapter是您的适配器列表视图,getData返回列表以及setFilters方法内部的自定义适配器

public void setFilters(List<Item> filters) {
    items = new ArrayList<>();
    items.addAll(filters);
    notifyDataSetChanged();
}

我希望能有所帮助。如果您对here感到困惑,可以查看本教程。