Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在用JSON数据填充的ListView中搜索_Android_Json_Listview_Search - Fatal编程技术网

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

Android 在用JSON数据填充的ListView中搜索,android,json,listview,search,Android,Json,Listview,Search,我的问题如下:我想在JSON数据生成的ListView中实现一种搜索机制,但我不知道在这种情况下该怎么做 我已经找到了很多例子,但我想实现最简单的解决方案,尤其是一个可以理解的解决方案 这是我的带有适配器和MainActivity类的Pastebin 你能给我一些建议吗?我被卡住了。搜索功能应该是这样的 public void searchList(String query){ List<Records> matchedActors = new ArrayList<R

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

我已经找到了很多例子,但我想实现最简单的解决方案,尤其是一个可以理解的解决方案

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


你能给我一些建议吗?我被卡住了。

搜索功能应该是这样的

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
}
编辑

我没有注意到您正在使用可过滤的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;
 }
@覆盖
公共过滤器getFilter(){
过滤器过滤器=新过滤器(){
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
actorList=(列表)results.values;
notifyDataSetChanged();
}
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults results=新的FilterResults();
List matchedActors=新的ArrayList();
//注意mOriginalValues将是一个类变量,我们用来跟踪我们的值
if(mOriginalValues==null){
mOriginalValues=新的ArrayList(actorList);
}
如果(constraint==null | | constraint.length()==0){
results.count=mOriginalValues.size();
结果.值=mOriginalValues;
} 
否则{
constraint=constraint.toString().toLowerCase();
List matchedActors=新的ArrayList();
对于(int i=0;i
它需要保留在json中吗?有许多库可以为您提供更易于使用的数据。除此之外,
最简单的
可理解的
是相对的术语。您好,是的,它们需要保留在json中,因为我通过POST(PHP页面)发送数据直接发送到JSON文件,然后JSON将数据发送到应用程序。在我的例子中,另一个选项只能是XML。是的,最简单和可理解的与两件事有关:第一件事是我只需要使用EditView搜索,而不需要更多的“可理解的”这意味着我可能不想与粘贴代码并说“这是我问题的解决方案”的人建立链接,但在我的情况下我无法理解。我个人建议调查GSON(我会说截击,但听起来你已经建立了网络,可能不值得重建).GSON将允许您将JSON转换为对象(反之亦然)使其更易于使用。一旦您完成了搜索,可能会更简单,因为手动解析实际上是不必要的。那么手动解析呢?与此同时,我将搜索截取,但是,正如您所说,如果这只是一些代码行的意思,我认为为这种特定情况找到解决方案将是最好的方法(如果没有严格的必要,我现在不想研究另一个库)我的意思是,你真正需要做的就是创建一个可编辑的文本,你可以用它来搜索(EditText或SearchView)。提交时,使用一个方法解析json以查找与搜索查询的匹配项,从这些匹配项中创建一个列表,将适配器设置为该列表,并使用adapter.notifyDataSetChanged()通知适配器已发生更改。我会将该搜索设置为异步任务,以便您可以在需要时轻松管理进度条,并且不会冻结主UI线程。或者,您可以使用中已提供的
过滤器
机制ArrayAdapter@njzk2我不知道为什么我认为他使用的是另一种类型的适配器。现在我看到了,我将重新编写代码。谢谢编辑一个有点问题:我得到了一些错误。似乎括号遗漏了一个半列。我必须将mOriginalValues声明为类变量,但它是哪种类型的变量?在publishResults方法中,actorList不是类开头声明的ArrayList记录吗?此导入(import android.widget.Filter.FilterResults;)不可用,并且找不到匹配的驱动程序。它是什么?我应该在哪里声明“adapter”?作为ArrayAdapter类(adapter)开头的某个内容?很抱歉这些非常新的问题:)@dabadee,我要跟你们讨论这个问题,因为简单地回答它并不能帮助你们理解你们在做什么:1.如果它说你们需要一个分号,试着加上它,看看它有什么作用。2.看看我们试图将MoriginalValue设置为什么,看看我们想在整个课堂上访问MoriginalValue,你们会怎么做u声明与此匹配的变量?3.导入应该可用,它是Android框架的一部分。4.您是创建变量matchedActors的人,您应该知道它是什么:)好的,避免了半列问题,但导入问题仍然存在(类型Android.widget.Filter.FilterResults不可见),我不知道为什么,但在一些堆栈问题中,我发现这个问题不仅仅是我的问题。该方法不是“public”吗,还是它意味着其他什么?mOriginalValues最初是对Records类的ArrayList引用,不是吗?最后是指“adapter.getItem[i]”的适配器这是什么?如果我没有做错,那么我是在适配器类内部编写这个函数
adapter = new RecordsAdapter(MainActivity.this, R.layout."your_layout_resource", actorList);
listview.setAdapter(adapter);
@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;
 }