在使用JSON数据填充的ListView中搜索

时间:2014-11-10 19:18:29

标签: android json listview search

我的问题如下:我想在我的JSON数据生成的ListView中实现一个搜索机制,但我不知道该怎么办。

我发现了很多例子,但我想实现最简单的解决方案,尤其是可以理解的解决方案。

这是我的带有Adapter和MainActivity类的Pastebin。

http://pastebin.com/SSXHXK7m

你可以给我任何建议吗?我被卡住了。

1 个答案:

答案 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;
 }