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