2

I already retrieve the data from FireStore successfully, and i want to search list of data using SearchView, but it doesnt show anything in recyclerView when i try to search in Searchview.

Here is my code for Main Activity. I retrieve the list of data using query and show in recycler View.

    public class MainActivity extends AppCompatActivity {

    private final static String TAG = MainActivity.class.getSimpleName();

    private RecyclerView recyclerView;

    private FirebaseAuth mAuth;
    private FirebaseFirestore db;
    private FoodAdapter mAdapter;
    SearchView searchView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mAuth = FirebaseAuth.getInstance();
        db = FirebaseFirestore.getInstance();


        // Force Login
        if (mAuth.getCurrentUser() == null || mAuth.getCurrentUser().getEmail().isEmpty()) {
            Intent intent = new Intent(this, Login.class);
            startActivity(intent);
            finish();
        }

        recyclerView = findViewById(R.id.recycler_home);   

        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        searchView = findViewById(R.id.search);

        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setMaxWidth(Integer.MAX_VALUE);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {

                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                getSearch(newText);
                return false;

            }
        });


        mAdapter = new FoodAdapter(new FoodAdapter.OnFoodClickListener() {
            @Override
            public void OnClick(FoodModel food) {
                Intent intent = new Intent(MainActivity.this, FoodActivity.class);
                intent.putExtra("id", food.getId());
                startActivity(intent);
            }

        getFoodData();

        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false));
        recyclerView.setAdapter(mAdapter);

    }




    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        getFoodData();
    }

public void getSearch(String s){

    mAdapter.clear();

    Query que = db.collection("Food");

        que.whereEqualTo("title", s);

        que

            .get()
            .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(QuerySnapshot documentSnapshots) {
                    if (!documentSnapshots.isEmpty()) {
                        for (DocumentSnapshot docSnap : documentSnapshots.getDocuments()) {
                            FoodModel model = docSnap.toObject(FoodModel.class);
                            model.setId(docSnap.getId());
                            loadSticker(model);

                        }
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.d(TAG, e.getLocalizedMessage());
                }
            });
}


    public void getFoodData() {

        mAdapter.clear();

        Query query = db.collection(“Food”);

        query
                .get()
                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(QuerySnapshot documentSnapshots) {
                        if (!documentSnapshots.isEmpty()) {
                            for (DocumentSnapshot docSnap : documentSnapshots.getDocuments()) {
                                FoodModel model = docSnap.toObject(FoodModel.class);
                                model.setId(docSnap.getId());
                                loadSticker(model);

                            }
                        }
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.d(TAG, e.getLocalizedMessage());
                    }
                });
    }

    public void loadSticker(final FoodModel foodModel) {

        db
                .collection("beverage")
                .whereEqualTo("name", foodModel.getBeverage())
                .get()
                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(QuerySnapshot documentSnapshots) {

                        if (documentSnapshots.getDocuments().get(0).exists()) {
                            BeverageModel model = documentSnapshots.getDocuments().get(0).toObject(BeverageModel.class);

                            FoodModel newFoodModel = foodModel;
                            newFoodModel.setSticker(model.getSticker());
                            mAdapter.addItem(newFoodModel);
                        }
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.d(TAG, e.getLocalizedMessage());
                    }
                });
    }
}

Here is the adapter code, which i apply filter for searchView. Anybody knows whats the error in my code for adapter.

    public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.FoodViewHolder> {

    private List<FoodModel> foodModels;
    private List<FoodModel>foodModelsList;
    private OnFoodClickListener listener;


    public FoodAdapter(OnFoodClickListener listener) {
        foodModels = new ArrayList<>();
        this.foodModelsList = foodModels;
        this.listener = listener;
    }

    @Override
    public FoodViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_holder_food, parent, false);
        return new FoodViewHolder(view);
    }

    @Override
    public void onBindViewHolder(FoodViewHolder holder, int position) {

        FooModel model = foodModels.get(position);

        holder.title.setText(model.getTitle());
        holder.description.setText(model.getDescription());

            Picasso.get().load(model.getSticker()).into(holder.sticker);
    }

    @Override
    public int getItemCount() {
        return foodModels.size();
    }

    public void addItem(FoodModel food){
        foodModels.add(food);
        notifyDataSetChanged();
    }


    class FoodViewHolder extends RecyclerView.ViewHolder {

        private TextView name, description;
        private ImageView sticker;

        FoodViewHolder(View itemView) {
            super(itemView);

            title = itemView.findViewById(R.id.tv_title);
            sticker = itemView.findViewById(R.id.img_sticker);
            description = itemView.findViewById(R.id.tv_description);


            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int position = getAdapterPosition();
                    listener.OnClick(foodModels.get(position));
                }
            });

         }
    }

    public interface OnFoodClickListener{
        void OnClick(FoodModel food);
    }
}
Much
  • 165
  • 1
  • 1
  • 16
  • You can take a look [here](https://stackoverflow.com/questions/49596610/is-it-possible-to-use-algolia-query-in-firestorerecycleroptions/49607796). – Alex Mamo Jul 09 '18 at 15:53
  • i had change some of my code, search using query, but it doesn't work – Much Jul 10 '18 at 05:53

0 Answers0