我有json数组,我将数组的所有项目都放在列表中。我需要的是搜索此列表。我试过这个功能
// Locate the EditText in listview_main.xml
final EditText editsearch = (EditText) findViewById(R.id.editText1);
// Capture Text in EditText
editsearch.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
String text = editsearch.getText().toString().toLowerCase(Locale.getDefault());
adapter1.filter(text);
}
});
但是当我尝试输入任何内容时,列表变为空白
我在自定义列表适配器中有我的过滤器,如下所示
// Filter Class
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
movieItems.clear();
if (charText.length() == 0) {
movieItems.addAll(movieItems);
}
else
{
for (Movie wp : movieItems)
{
if (wp.getNAME().toLowerCase(Locale.getDefault()).contains(charText))
{
movieItems.add(wp);
}
}
}
notifyDataSetChanged();
}
我该如何解决?
答案 0 :(得分:0)
您在clear
之前呼叫addAll
,因此您要添加一个空列表。创建一个临时的“filteredList”并保存对“originalList”的引用
// Filter Class
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
List<Movie> filteredMovies = new ArrayList<Movie>();
if (charText.length() == 0) {
filteredMovies.addAll(originalMovieList);
}
else
{
for (Movie wp : movieItems)
if (wp.getNAME().toLowerCase(Locale.getDefault()).contains(charText))
filteredMovies.add(wp);
}
notifyDataSetChanged();
}
请记住,您的自定义适配器必须处理filteredList而不是原始
答案 1 :(得分:0)
如果没有看到整个适配器代码,很难说出你的问题究竟是什么。但是,您似乎在自定义适配器中手动实现了一个名为filter()
的方法?您的自定义适配器(假设它正在扩展BaseAdapter
)应该实现Filterable
接口,然后您可以访问该接口以执行过滤搜索。
滚动自己的解决方案可能很困难。我建议查看https://github.com/JaySoyer/Advanced-Adapters回购。它包含一堆适配器,它们提供了一种非常简单的方法来定义自己的过滤逻辑。还有一个专门用于与JSONArrays
一起使用。
答案 2 :(得分:0)
基本上,您的过滤列表与主过滤列表不同,并存储所有过滤后的结果。
当您输入搜索字词时,已过滤的列表会包含所有结果。将此列表设置为adapter,然后使用新列表调用notifydatasetchanged()。