Use Searchview to search for a populated model class with firebase

Asked

Viewed 210 times

0

Good night ! I am stuck in a problem, in this I have a list of items I receive from firebase, in this list I have visibly 3 attributes of the model class (idAtivity, title and time), thus, I would like the searchview I implemented to search a certain text that I populated in the arraylist of this object, in this case it may even be passing the fixed attribute/column, my codes:

public class AtividadesCriadasFragment extends Fragment implements SearchView.OnQueryTextListener {

//ATRIBUTOS
SearchView searchView;
private ListView listView;
private ArrayAdapter adapter;
private ArrayList<Atividade> atividadeArrayList;
private DatabaseReference reference;
private ValueEventListener valueEventListener;
String idUsuario;

public AtividadesCriadasFragment(){

}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_atividades_criadas, container, false);

    searchView = (SearchView) view.findViewById(R.id.id_search);

    //Montando list view e adapter
    atividadeArrayList = new ArrayList<>();
    listView = (ListView) view.findViewById(R.id.lv_minhas_atividades);

    adapter = new AtividadesCriadasAdapter(getActivity(), atividadeArrayList);
    listView.setAdapter(adapter);
    //ATÉ AQUI JÁ FOI CRIADO UMA LISTA QUE É APRESENTADA PARA O USUÁRIO

    //Implementação do searchView
    searchView.setOnQueryTextListener(this);

    //*************** RECUPERANDO A LISTA DE ATIVIDADES CRIADAS POR ESSE USUÁRIO ************/
    SharedPreferencesUser user = new SharedPreferencesUser(getActivity());
    idUsuario = user.getIdentificador();

    reference = ConfiguracaoFirebase.getReferenceFirebase()
            .child("ATIVIDADES")
            .child(idUsuario);

    //Evento de consulta
    valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            //LIMPANDO A LISTA
            atividadeArrayList.clear();

            //Listando cada uma das atividades criadas pelo usuário
            for (DataSnapshot dados: dataSnapshot.getChildren()){ //recupera os filhos do nó principal
                Atividade atividade = dados.getValue(Atividade.class);
                atividadeArrayList.add(atividade);
            }

            adapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };

    return view;
}

In this case, as you can see, the List array is populated according to the return I got from the Activity class. The methods of searchView

@Override
public boolean onQueryTextSubmit(String s) {
    return false;
}

@Override
public boolean onQueryTextChange(String texto) {

    //Atividade atividade = new Atividade();
    adapter.getFilter().filter(texto);
    return false;
}

And the Adapter that receives the information and inflates it on the screen for the user:

    public class AtividadesCriadasAdapter extends ArrayAdapter<Atividade>{
    //ATRIBUTOS
    private ArrayList<Atividade> atividadeArrayList;
    private Context context;

    public AtividadesCriadasAdapter(@NonNull Context c, @NonNull ArrayList<Atividade> objects) {
        super(c, 0, objects);

        this.atividadeArrayList = objects;
        this.context = c;
    }

    //METODO PARA EXIBIÇÃO DA LISTA


    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        //Criando uma view do zero
        View view = null;

        //Validando a lista
        if (atividadeArrayList != null){
            //Inicializando o objeto para montagem das views
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

            //Montando a view a partir do XML
            view = inflater.inflate(R.layout.lista_suas_atividades, parent, false);

            //Recuperando os elementos para exibição
            TextView id = (TextView) view.findViewById(R.id.tvID_list);
            TextView titulo = (TextView) view.findViewById(R.id.tvTitulo_list);
            TextView tempo = (TextView) view.findViewById(R.id.tvTempo_list);
            RoundedImageView imCategoria = (RoundedImageView) view.findViewById(R.id.im_categoria_list);

            Atividade atividade = atividadeArrayList.get(position);
            id.setText(atividade.getId());
            titulo.setText(atividade.getTitulo());
            tempo.setText(atividade.getTempo());

        }
        return view;
    }
}

The way the code is, every time I enter any digit in the searchview it already Zera the results finding nothing, I wanted to at least search for the node . Child("ACTIVITIES"). Child("Idusuario"). Child("idAtivity") <- search by idAtivity for example, which in the activity class is the parameter 'id'.

1 answer

0

Try this instead of Arraylist use List<Suaclasse> list;

in your Adapter create the way:

public void setFilter(List<Suaclasse> Searchlist) {
    list= new ArrayList<>();
    list.addAll(Searchlist);
    notifyDataSetChanged();
}

in its activity: //onCreate Searchview searchView = getView(). findViewById(R.id.searchView); searchView.setOnQueryTextListener(this);

list = new Arraylist<>();

ValueEventListener listener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            list.removeAll(list);
            for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()){

                SuaClasse model = singleSnapshot.getValue(SuaClasse.class);
                list.add(model);
                SeuAdapter.notifyDataSetChanged();
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };

    mDataBase.addValueEventListener(listener);

//Fim onCreate

@Override public Boolean onQueryTextSubmit(String query) { Return false; } @Override public Boolean onQueryTextChange(String newText) { final List filteredModelList = filter(List, newText);

        ListView.setFilter(filteredModelList);


    return true;
}
private List<Suaclasse> filter(List<Suaclasse> models, String query) {
    query = query.toLowerCase();
    final List<Suaclasse> filteredModelList = new ArrayList<>();

    for (SuaClasse model : models) {
            final String text = model.getNome().toLowerCase();

            if (text.contains(query)) {
                filteredModelList.add(model);
            }else if(text.contains(query)){
                filteredModelList.add(model);
            }
    }
    return filteredModelList;
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.