我的问题如下:我想在我的JSON数据生成的ListView中实现一个搜索机制,但我不知道该怎么办。
我发现了很多例子,但我想实现最简单的解决方案,尤其是可以理解的解决方案。
这是我的带有Adapter和MainActivity类的Pastebin。
你可以给我任何建议吗?我被卡住了。答案 0 :(得分:1)
搜索功能将是这样的
public void searchList(String query){
List<Records> matchedActors = new ArrayList<Records>();
for(int i = 0; i < adapter.getCount(); i++){
if(adapter.getItem(i).getAuthor().equals(query)
matchedActors.add(adapter.getItem(i));
}
// See below for what to put here
}
然后,您可以通过在适配器类中创建/调用类似
的方法来修改适配器public void modifyList(List<Records> actorList){
this.actorList = actorList;
notifyDataSetChanged();
}
并在搜索后调用adapter.modifyList(matchedActors)
,或者在搜索后通过实例化适配器的新实例,
adapter = new RecordsAdapter(MainActivity.this, R.layout."your_layout_resource", actorList);
listview.setAdapter(adapter);
修改强>
我没有注意到您使用的是Filterable ArrayAdapter:P您可以在适配器中实现以下功能。
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {
actorList = (List<Records>) results.values;
notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
List<Records> matchedActors = new ArrayList<Records>();
//NOTE mOriginalValues will be a class variable we use to keep track of our values
if (mOriginalValues == null) {
mOriginalValues = new ArrayList<Records>(actorList);
}
if (constraint == null || constraint.length() == 0) {
results.count = mOriginalValues.size();
results.values = mOriginalValues;
}
else {
constraint = constraint.toString().toLowerCase();
List<Records> matchedActors = new ArrayList<Records>();
for(int i = 0; i < getCount(); i++){
if(mOriginalValues.getAuthor().toLowerCase().startsWith(constraint)
matchedActors.add(getItem(i);
}
// set the Filtered result to return
results.count = matchedActors.size();
results.values = matchedActors;
}
return results;
}
return filter;
}