Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.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 Searchview筛选器不适用于包含已解析JSON的列表,但适用于非JSON列表_Android_Android Studio - Fatal编程技术网

Android Searchview筛选器不适用于包含已解析JSON的列表,但适用于非JSON列表

Android Searchview筛选器不适用于包含已解析JSON的列表,但适用于非JSON列表,android,android-studio,Android,Android Studio,这是我的MainActivity.java。问题的一部分是getVolley()方法。用解析的JSON数据填充列表列表会导致SearchView不可用(不会过滤结果)。当列表中充满JSON数据时,在SearchView中键入任何内容都会完全删除列表中的所有内容。但是,如果我注释掉JSON部分并取消注释注释了的部分,SearchView就会工作。列表完全相同,唯一的区别是我要么从JSON获取数据,要么从底部注释掉的代码块获取数据 private void getVolley(){

这是我的MainActivity.java。问题的一部分是getVolley()方法。用解析的JSON数据填充列表列表会导致SearchView不可用(不会过滤结果)。当列表中充满JSON数据时,在SearchView中键入任何内容都会完全删除列表中的所有内容。但是,如果我注释掉JSON部分并取消注释注释了的部分,SearchView就会工作。列表完全相同,唯一的区别是我要么从JSON获取数据,要么从底部注释掉的代码块获取数据

        private void getVolley(){
            liste = new ArrayList<>();
            RequestQueue queue = Volley.newRequestQueue(getApplicationContext());

            JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            try {
                                JSONArray jsonArray = response.getJSONArray("entries");
                                for (int i = 0; i < jsonArray.length(); i++) {
                                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                                    liste.add(new Recycler(jsonObject.getString("navn")));
                                    recyclerAdapter.notifyDataSetChanged();
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    error.printStackTrace();
                }
            });
            queue.add(request);

/*
            liste = new ArrayList<>();
            for (int i = 0; i < 6; i++) {
                if (i == 1)
                liste.add(new Recycler( "en"));
                if (i == 2)
                    liste.add(new Recycler( "to"));
                if (i == 3)
                    liste.add(new Recycler( "tree"));
                if (i == 4)
                    liste.add(new Recycler( "fire"));
                if (i == 5)
                    liste.add(new Recycler( "fem"));
            }
*/
        }
这就是我初始化RV的地方。这个方法只是在onCreate中调用的

    private void setRecyclerView() {
//Kaller på volley
        getVolley();
        RecyclerView recyclerView = findViewById(R.id.holder);

        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerAdapter = new RecyclerAdapter(liste);
        recyclerView.setAdapter(recyclerAdapter);
    }
这是适配器代码

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> implements Filterable {

    private List<Recycler> liste;
    private List<Recycler> fullListe;

    RecyclerAdapter(List<Recycler> liste) {
        this.liste = liste;
        fullListe = new ArrayList<>(liste);
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.test_tekst, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Recycler recycler = liste.get(position);
        holder.textView.setText(recycler.getNavn());
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        TextView textView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.textView123);
        }
    }

    @Override
    public int getItemCount() {
        return liste.size();
    }

    @Override
    public Filter getFilter() {
        return exampleFilter;
    }
    private Filter exampleFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            List<Recycler> filtrert = new ArrayList<>();

            if (charSequence == null || charSequence.length() == 0) {
                filtrert.addAll(fullListe);
            } else {
                String filterPattern = charSequence.toString().toLowerCase().trim();
                for (Recycler navn : fullListe) {
                    if (navn.getNavn().toLowerCase().contains(filterPattern)) {
                        filtrert.add(navn);
                    }
                }
            }

            FilterResults resultat = new FilterResults();
            resultat.values = filtrert;

            return resultat;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults resultat) {
            liste.clear();
            liste.addAll((List) resultat.values);
            notifyDataSetChanged();
        }
    };


}
公共类RecyclerAdapter扩展了RecyclerView。适配器实现可过滤{
私有列表列表;
私人名单;
回收器适配器(列表列表){
this.liste=liste;
fullListe=新的数组列表(liste);
}
@非空
@凌驾
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){
LayoutInflater LayoutInflater=LayoutInflater.from(parent.getContext());
视图=布局更平坦。充气(R.layout.test_-tekst,父项,false);
ViewHolder ViewHolder=新的ViewHolder(视图);
返回视图持有者;
}
@凌驾
public void onBindViewHolder(@NonNull ViewHolder,int位置){
回收商回收商=列表获取(位置);
holder.textView.setText(recycler.getNavn());
}
类ViewHolder扩展了RecyclerView.ViewHolder{
文本视图文本视图;
公共视图持有者(@NonNull View itemView){
超级(项目视图);
textView=itemView.findViewById(R.id.textView123);
}
}
@凌驾
public int getItemCount(){
返回liste.size();
}
@凌驾
公共过滤器getFilter(){
返回示例过滤器;
}
私有筛选器exampleFilter=新筛选器(){
@凌驾
受保护过滤器结果执行过滤(CharSequence CharSequence){
List filterrt=new ArrayList();
if(charSequence==null | | charSequence.length()==0){
filterrt.addAll(fullListe);
}否则{
String filterPattern=charSequence.toString().toLowerCase().trim();
用于(回收商导航:fullListe){
if(navn.getNavn().toLowerCase().contains(filterPattern)){
过滤器添加(navn);
}
}
}
FilterResults Results=新的FilterResults();
resultat.values=filterrt;
返回结果;
}
@凌驾
受保护的void publishResults(CharSequence CharSequence、FilterResults Results resultat){
liste.clear();
addAll((列表)resultat.values);
notifyDataSetChanged();
}
};
}

尝试在
外调用
notifyDataSetChanged
进行
循环

private void setRecyclerView() {
    liste = new ArrayList<>();
    RecyclerView recyclerView = findViewById(R.id.holder);

    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerAdapter = new RecyclerAdapter(liste);
    recyclerView.setAdapter(recyclerAdapter);

    //Kaller på volley
    getVolley();
}

尝试调用
notifyDataSetChanged
进行
循环的
外部

private void setRecyclerView() {
    liste = new ArrayList<>();
    RecyclerView recyclerView = findViewById(R.id.holder);

    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerAdapter = new RecyclerAdapter(liste);
    recyclerView.setAdapter(recyclerAdapter);

    //Kaller på volley
    getVolley();
}

您有一个并发问题,因为getVolley在创建适配器时启动了一个异步任务。行
fullList=new ArrayList(liste)
copy将空数组(稍后将填充)的内容复制到您希望成为完整数组的列表中,因此必须执行以下操作:

(考虑到您将fullListe公之于众)

public void onResponse(JSONObject-response){
试一试{
JSONArray JSONArray=response.getJSONArray(“条目”);
for(int i=0;i

而且它应该已经工作了

您有一个并发问题,因为当您创建适配器时getVolley会启动一个异步任务。行
fullList=new ArrayList(liste)
将空数组(稍后将填充)的内容复制到您想要成为完整数组的列表中,您必须执行以下操作:

(考虑到您将fullListe公之于众)

public void onResponse(JSONObject-response){
试一试{
JSONArray JSONArray=response.getJSONArray(“条目”);
for(int i=0;i

而且它应该已经起作用了

谢谢你的回答,不幸的是没有起作用:(添加你的
回收器
模型。还有RVOk的初始化pard,这就是你要找的吗?(我编辑了帖子)不幸的是,这也不起作用。我仍然得到相同的结果。我认为
notifyDataSetChanged
工作不正常。您能否按相同的顺序尝试您的固定项目谢谢您的回答,不幸的是,这不起作用:(添加你的
Recycler
模型。还有RVOk的初始化pard,这就是你想要的吗?(我编辑了这篇文章)不幸的是,它也不起作用。我
private void getVolley() {
    liste.clear();
    RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
    String url = "https://hotell.difi.no/api/json/mattilsynet/smilefjes/tilsyn";
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        JSONArray jsonArray = response.getJSONArray("entries");
                        for (int i = 0; i < jsonArray.length(); i++) {
                            JSONObject jsonObject = jsonArray.getJSONObject(i);
                            liste.add(new Recycler(jsonObject.getString("navn")));
                        }

                        recyclerAdapter.notifyDataSetChanged();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });
    queue.add(request);
}
           public void onResponse(JSONObject response) {
                try {
                    JSONArray jsonArray = response.getJSONArray("entries");
                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject jsonObject = jsonArray.getJSONObject(i);
                        liste.add(new Recycler(jsonObject.getString("navn")));
                    }

                    recyclerAdapter.fullListe.addAll(liste); // here you add the contets to the full list later after it has been created
                    recyclerAdapter.notifyDataSetChanged();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }