[英]Using SearchView with ArrayList Android Studio
晚安,我是初学者,我无法使用 ArrayList 创建 SearchView。 我在互联网上尝试了几个示例或手册,但没有成功,我仍然无法理解过滤器是如何在 onQueryTextChange 上制作的。 我有一个学习应用程序,其中我有一个 Firebase 电影列表,其中包含标题、类型和年份,我需要通过电影标题搜索 searchVIew 并带来搜索到的内容。 我需要使用这些代码的建议。 谢谢你。
MainActivity.java
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private List<Filme> listaFilmes = new ArrayList<>();
private Adapter adapter;
private DatabaseReference referencia;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
referencia = FirebaseDatabase.getInstance().getReference();
recyclerView = findViewById(R.id.recyclerView);
//Lista de Filmes
this.criarFilmes();
//Configurar RecyclerView
adapter = new Adapter(listaFilmes);
//Configurar RecyclerView
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);
recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayout.VERTICAL));
recyclerView.setAdapter(adapter);
}
private void criarFilmes() {
DatabaseReference dados = referencia.child("Filmes");
dados.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot valores: snapshot.getChildren()){
Filme filme = valores.getValue(Filme.class);
listaFilmes.add(filme);
}
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
MenuItem item = menu.findItem((R.id.action_sarch));
SearchView searchView = (SearchView) item.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
System.out.println(listaFilmes);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
String text = newText;
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
适配器.java
public class Adapter extends RecyclerView.Adapter<Adapter.MyviewHolder> {
private List<Filme> listaFilmes = null;
private ArrayList<Filme> arrayList;
public Adapter(List<Filme> listaFilmes) {
this.listaFilmes = listaFilmes;
this.arrayList = new ArrayList<Filme>();
this.arrayList.addAll(listaFilmes);
}
@NonNull
@Override
public MyviewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemLista = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_layout, parent, false);
return new MyviewHolder(itemLista);
}
@Override
public void onBindViewHolder(@NonNull MyviewHolder holder, int position) {
Filme filme = listaFilmes.get(position);
holder.titulo.setText(filme.getTitulo());
holder.genero.setText(filme.getGenero());
holder.ano.setText(filme.getAno());
}
@Override
public int getItemCount() {
return listaFilmes.size();
}
public class MyviewHolder extends RecyclerView.ViewHolder{
TextView titulo, genero, ano;
public MyviewHolder(@NonNull View itemView) {
super(itemView);
titulo = itemView.findViewById(R.id.textTitulo);
genero = itemView.findViewById(R.id.textGenero);
ano = itemView.findViewById(R.id.textAno);
}
}
Filme.java
public class Filme {
private String titulo, genero, ano;
public Filme() {
}
public Filme(String titulo, String genero, String ano) {
this.titulo = titulo;
this.genero = genero;
this.ano = ano;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getGenero() {
return genero;
}
public void setGenero(String genero) {
this.genero = genero;
}
public String getAno() {
return ano;
}
public void setAno(String ano) {
this.ano = ano;
}
我正在等待帮助...
我在您的适配器中没有看到任何过滤方法。 您需要一种过滤列表的方法。 将以下方法添加到您的适配器中。
public void filterList(List<Filme> filteredList) {
listaFilmes = filteredList;
notifyDataSetChanged();
}
在您的 MainActivity 中,创建另一个方法并定义您希望如何过滤列表。 如果您想使用以输入文本开头的电影过滤列表:
private void filter(String text) {
List<Filme> filteredList = new ArrayList<>();
for (Filme item : listaFilmes) {
if (item.getTitulo().toLowerCase().startsWith(text.toLowerCase())) {
filteredList.add(item);
}
}
adapter.filterList(filteredList);
}
或者,如果您想使用包含输入文本的电影过滤列表:
private void filter(String text) {
List<Filme> filteredList = new ArrayList<>();
for (Filme item : listaFilmes) {
if (item.getTitulo().toLowerCase().contains(text.toLowerCase())) {
filteredList.add(item);
}
}
adapter.filterList(filteredList);
}
并且 onCreateOptionsMenu 调用该方法并使用newText
进行过滤。 而不是return super.onCreateOptionsMenu(menu)
方法必须return true
。 否则它不会过滤您的列表。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
MenuItem item = menu.findItem((R.id.action_sarch));
SearchView searchView = (SearchView) item.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
filter(newText);
return false;
}
});
return true;
}
在 Adapter 中使用Filterable ,您可以轻松地从 recyclerview 中搜索项目,因此在回收器适配器 class 中implements Filterable
Filterable,因此getFilter
方法将像这样添加:
适配器.java
public class Adapter extends RecyclerView.Adapter<Adapter.MyviewHolder> implements Filterable {
private List<Filme> listaFilmes = null;
private ArrayList<Filme> arrayList;
public Adapter(List<Filme> listaFilmes) {
this.listaFilmes = listaFilmes;
this.arrayList = new ArrayList<Filme>();
this.arrayList.addAll(listaFilmes);
}
@NonNull
@Override
public MyviewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemLista = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_layout, parent, false);
return new MyviewHolder(itemLista);
}
@Override
public void onBindViewHolder(@NonNull MyviewHolder holder, int position) {
Filme filme = listaFilmes.get(position);
holder.titulo.setText(filme.getTitulo());
holder.genero.setText(filme.getGenero());
holder.ano.setText(filme.getAno());
}
@Override
public int getItemCount() {
return listaFilmes.size();
}
public class MyviewHolder extends RecyclerView.ViewHolder{
TextView titulo, genero, ano;
public MyviewHolder(@NonNull View itemView) {
super(itemView);
titulo = itemView.findViewById(R.id.textTitulo);
genero = itemView.findViewById(R.id.textGenero);
ano = itemView.findViewById(R.id.textAno);
}
//getFilter for filter your search query
@Override
public android.widget.Filter getFilter() {
return new android.widget.Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
FilterResults results = new FilterResults();
String charString = charSequence.toString();
if (charString.isEmpty()) {
//if your search string is empty them all data will displayed
listaFilmes = arrayList;
}
else {
List<Filme> filteredList = new ArrayList<>();
for (Filme row : arrayList) {
//use can search here by anything, like: title, discription amount
if ((row.getTitulo().toLowerCase()).contains(charString.toLowerCase())) {
filteredList.add(row);
}
}
//new searched data aaded to your main list
listaFilmes = filteredList;
}
if (listaFilmes != null) {
// The API successfully returned results.
results.values = listaFilmes;
results.count = listaFilmes.size();
}
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
if (filterResults != null) {
listaFilmes = (ArrayList<Filme>) filterResults.values;
// The API returned at least one result, update the data.
notifyDataSetChanged();
} else {
// The API did not return any results, invalidate the data set.
//notifyDataSetInvalidated();
}
}
};
}
}
现在在onQueryTextChange()
中简单使用过滤器
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
MenuItem item = menu.findItem((R.id.action_sarch));
SearchView searchView = (SearchView) item.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
System.out.println(listaFilmes);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
//call your adapter filter function
adapter.getFilter().filter(newText);
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.