android - 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
解决方案
推荐阅读
- rpgle - DLCOBJ 不发布文件
- docker - Google Compute Engine VM 在一段时间后停止
- c - Linux内核列表实现会导致UB吗?
- java - 在 Windows 上安装 Ejbca 时,“c:\ejbca\p12\truststore.jks”中缺少 JKS 信任库文件
- google-apps-script - 如果不满足第一个条件则不执行任何操作的 if 语句
- javascript - 如何访问“li”元素包含其子“a”的列表?
- sql - 检查列数据类型并在 SQL Server 中更改它
- ios - Ios中的错字反应本机无法识别
- ios - 在 iOS 14.2 上使用 VoIP 打开 CallKit 无法在终止状态下工作
- sql - TSQL:查询以最大大小的数据包分组文件