我正在使用PDF阅读器。我已经创建了一个列表视图,其中将保存您移动设备中所有的PDF文件。
现在,当我使用EditText字段对此列表视图执行搜索时,问题是它无法正确搜索文件,例如,我有5个文件名为 sample.pdf,resume-sample.pdf,resume sample.pdf,resume.pdf,sampleresume.pdf。
现在,如果我搜索:
“样本”,我将得到以下结果:sample.pdf并恢复sample.pdf
“恢复”,我将得到以下结果: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) {
}
});
答案 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感到困惑,可以查看本教程。