Use SearchView to search a populated model class with firebase

0

Good evening!   I'm stuck with a problem, in this I have a list of items I get from the firebase, in this list I have visibly 3 attributes of the model class (idAtivity, title and time), so I would like the searchview that I implemented searched for a certain text that I populated in arraylist of this object, in case it may be up to passing the attribute / fixed 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 arrayList is populated according to the return I got from the Activity class. The searchView methods

@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 to the screen:

    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;
    }
}

As the code is, every time I enter any digit in the searchview it already zeros the results not finding anything, I wanted to at least search for the .child ("ACTIVITIES") node. ("idAtivity")

asked by anonymous 26.09.2017 / 02:32

1 answer

0

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

on your adapter create the method:

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

in your 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);

// End onCreate

@Override     public boolean onQueryTextSubmit (String query) {         return false;     }     @Override     public boolean onQueryTextChange (String newText) {         end 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;
}
    
14.02.2018 / 03:16