【问题标题】:Search in ListView populated with JSON data在填充有 JSON 数据的 ListView 中搜索
【发布时间】:2014-11-10 19:18:28
【问题描述】:

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

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

这是我的带有适配器和 MainActivity 类的 Pastebin。

http://pastebin.com/SSXHXK7m

你能给我什么建议吗?我被卡住了。

【问题讨论】:

  • 是否需要保留在json中?有许多库可以为您提供更易于使用的数据。除此之外,simplestunderstandable 是相对术语。
  • 嗨,是的,它们需要保留在 JSON 中,因为我通过 POST(PHP 页面)将数据直接发送到 JSON 文件,然后 JSON 将数据发送到应用程序。在我的情况下,另一个选项只能是 XML。是的,最简单易懂与两件事有关:第一件事是我只需要使用 EditView 进行搜索,仅此而已,“可理解”意味着我可能不希望有人粘贴代码并说“这是我的问题的解决方案”,但在我的情况下我无法理解。
  • 我个人建议研究 GSON(我会说 Volley,但听起来你已经建立了网络,可能不值得重建它)。 GSON 将让您将 JSON 转换为对象(反之亦然),使其更易于使用。完成后,搜索可能会更简单,因为实际上不需要手动解析。
  • 那么手动解析呢?同时我会搜索 Volley,但是,正如你所说,如果它只是某些代码行的含义,我认为为这种特殊情况找到解决方案将是最好的方法(我不想研究另一个如果不是绝对必要的话,现在就去图书馆)
  • 嗯,我的意思是你真正需要做的就是创建一个可编辑的文本,你可以用它来搜索(EditText 或 SearchView)。在提交时,有一个方法可以解析您的 json 以与您的搜索查询匹配,从这些匹配项中创建一个列表,将您的适配器设置为该列表,并使用 adapter.notifyDataSetChanged() 通知该适配器发生了更改。我会将搜索设为 AsyncTask,这样您就可以在需要时轻松管理进度条,并且不会冻结您的主 UI 线程。

标签: android json listview search


【解决方案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;
 }

【讨论】:

  • 或者你可以使用ArrayAdapter中已经提供的Filter机制
  • @njzk2 我不知道为什么我认为他使用的是不同类型的适配器。现在我看到我将重新编写代码。谢谢
  • Edit one 出了点问题:我遇到了一些错误。似乎一个括号错过了一个半列。我必须将 mOriginalValues 声明为类变量,但它是哪种变量?在publishResults方法中,那个actorList不就是类开头声明的ArrayList记录吗?此导入 (import android.widget.Filter.FilterResults;) 不可用并且找不到匹配的Actors。它是什么?我应该在哪里声明“适配器”?作为 ArrayAdapter 类的开头的东西(适配器)?很抱歉这些新手问题:)
  • @dabadee 我会告诉你这个,因为简单地回答它不会帮助你理解你在做什么: 1. 如果它说你需要一个分号,试着添加它,看看它是什么做。 2. 看看我们试图将 mOriginalValues 设置为什么,看到并看到我们想要在整个类中访问 mOriginalValues,您如何声明变量以匹配它? 3. 该导入应该可用,它是 Android 框架的一部分。 4. 你是创建变量matchedActors的人,你应该知道它是什么:)
  • 好吧,半列问题避免了,但是导入问题依然存在(android.widget.Filter.FilterResults 类型不可见),我不知道为什么,但在一些堆栈问题中我'发现这个问题不仅是我的。那个方法不是“公开的”,还是有别的意思? mOriginalValues 最初是对 Records 类的 ArrayList 引用,不是吗?最后,您所指的适配器“adapter.getItem[i]”是什么?如果我没有做错,我正在适配器类本身中编写此函数
猜你喜欢
  • 2018-09-20
  • 2016-12-18
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多