繁体   English   中英

将 SearchView 与 ArrayList Android Studio 一起使用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM