首页 > 解决方案 > RecyclerView 的 SearchView 不起作用,我该怎么办?

问题描述

当我编写代码时,我意识到在 RecyclerView 中实现的 SearchView 不起作用,无论我对它做什么。

这是我的MainActivity.java

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;


import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private JSONArray requestArray;
    private RecyclerView recyclerView;
    private MyRecyclerAdapter mAdapter;
    List<News> listNews;
    private RecyclerView.LayoutManager layoutManager;
    protected void onCreate(Bundle savedInstanceState) {
        recyclerView = findViewById(R.id.RecyclerView);
        layoutManager = new LinearLayoutManager(this);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listNews=new ArrayList<>();
        final Context context = this;
        recyclerView();

        String url="https://newsapi.org/v2/top-headlines?country=nz&apiKey=6de8455617f64b80b7c79cb2a90cbec7";
        JsonObjectRequest json=new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {

                try {
                    requestArray=response.getJSONArray("articles");

                    for(int i=0;i<requestArray.length();i++){
                        JSONObject a= requestArray.getJSONObject(i);
                        listNews.add(new News(a.getString("title"),a.getString("description"),a.getString( "urlToImage"),a.getString("publishedAt"),a.getString("content")));
mAdapter.notifyDataSetChanged();

                    }
                } catch (JSONException e) {
                    Toast.makeText(context, "Got JSON response", Toast.LENGTH_SHORT).show();
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(context, "Error", Toast.LENGTH_SHORT).show();

            }
        });
        //creating a request queue
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        //adding the string request to request queue
        requestQueue.add(json);


    }
    public void recyclerView(){
        recyclerView = findViewById(R.id.RecyclerView);
        layoutManager = new LinearLayoutManager(this);
        mAdapter = new MyRecyclerAdapter(listNews);
        recyclerView.setAdapter(mAdapter);
        recyclerView.setLayoutManager(layoutManager);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater=getMenuInflater();
        inflater.inflate(R.menu.menu,menu);
        MenuItem searchItem=menu.findItem(R.id.action_search);
        SearchView searchView=(SearchView)searchItem.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                mAdapter.getFilter().filter(newText);
                return false;
            }
        });
        return true;
    }
}

这是我的适配器类

package com.example.myapplication;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.squareup.picasso.Picasso;

import org.w3c.dom.Text;

import java.util.ArrayList;
import java.util.List;


// Todo Implement methods required
//onCreateViewHolder()
//onBindViewHolder
//getItemCount
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> implements Filterable {
    List<News> listOfPlayers;
    List<News> listOfPlayersFull;
    Context context;
    int posi;

    public MyRecyclerAdapter(@NonNull List<News> objects) {
        listOfPlayers = objects;
        listOfPlayersFull=new ArrayList<>(listOfPlayers);

    }

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


    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.title.setText(listOfPlayers.get(position).getTitle()+"");
        holder.description.setText(listOfPlayers.get(position).getDescription()+"");
        holder.published_at.setText(listOfPlayers.get(position).getPublished_at()+"");
        holder.content.setText(listOfPlayers.get(position).getContent()+"");
        Picasso.get().load(listOfPlayers.get(position).getUrl()+"").into(holder.image);
    }

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


    // Todo implement ViewHolder
    public static class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView title;
        public TextView description;
        public TextView url;
        public TextView published_at;
        public TextView content;
        public ImageView image;
        // get references to each of the views in the single_item.xml
        // Todo implement constructor
        private MyViewHolder(@NonNull View single_player_view) {
            super(single_player_view);
            title = single_player_view.findViewById(R.id.title);
            description = single_player_view.findViewById(R.id.des);
            published_at = single_player_view.findViewById((R.id.pub));
            content= single_player_view.findViewById((R.id.cont));
            image= single_player_view.findViewById(R.id.ima);
        }
    }

    @Override
    public Filter getFilter() {
        return exampleFilter;
    }
    private Filter exampleFilter= new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<News> filteredList=new ArrayList<>();
            if (constraint==null||constraint.length()==0){
                filteredList.addAll(listOfPlayersFull);
            }
            else{
                String filterPattern=constraint.toString().toLowerCase().trim();
                for(News item: listOfPlayersFull ){
                    if(item.getTitle().toLowerCase().contentEquals(filterPattern)||item.getPublished_at().toLowerCase().contentEquals(filterPattern)){
                        filteredList.add(item);
                    }
                }

            }
            FilterResults results=new FilterResults();
            results.values=filteredList;
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            listOfPlayers.clear();
            listOfPlayers.addAll((List) results.values);
            notifyDataSetChanged();
        }
    };
}

这是我的菜单类(android.support.v7.widget.searchview 不起作用,这也是一个问题):

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_search_black_24dp"
        android:title="Search"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:showAsAction="ifRoom|collapseActionView" />
</menu>

谁能帮我?谢谢!PS:RecyclerView 工作得很好,唯一的问题是 SearchView

标签: androidandroid-recyclerview

解决方案


推荐阅读