Kiwi
Kiwi

Reputation: 181

Firebase Search with FirebaseRecyclerAdapter (Firebase UI 3.2.2)

I have a fragment in which with RecyclerView I show all the objects from Firebase DB. In the same fragment I have an EditText.

Goal: The user can search within the Firebase DB. The results of the search should be populated in the same RecyclerView, where originally are shown all the object from the DB. For this reason I am using FirebaseRecyclerAdapter which is provided by FirebaseUI Version 3.2.2. To reach this result I was following this YouTube tutorial https://www.youtube.com/watch?v=b_tz8kbFUsU.

Problem: The results are not shown and the search function does not work.

Here is my code.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         final Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_best_buys, container, false);

    recView = view.findViewById(R.id.fragment_best_buys_recycler_view_two);
    databaseReference = FirebaseDatabase.getInstance().getReference(Database_Path);

        // Edit Text Listener
    mEditText = view.findViewById(R.id.fragment_best_buys_edit_text);
    Button test = view.findViewById(R.id.faccia_search);
    test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String searchText = mEditText.getText().toString();
            firebaseUserSearch(searchText);
        }
    });

    return view;
}

private void firebaseUserSearch(String searchText) {

    System.out.print("I am searching: " + searchText);

    Toast.makeText(getActivity(), "Started Search " + searchText, Toast.LENGTH_LONG).show();

    Query firebaseSearchQuery = databaseReference.orderByChild("product_name")
             .startAt(searchText)
             .endAt(searchText + "\uf8ff");

    FirebaseRecyclerOptions<BestBuysProducts> options =
            new FirebaseRecyclerOptions.Builder<BestBuysProducts>()
                    .setQuery(firebaseSearchQuery, BestBuysProducts.class)
                    .build();

    FirebaseRecyclerAdapter<BestBuysProducts, BestBuysViewHolder> adapter = new FirebaseRecyclerAdapter<BestBuysProducts, BestBuysViewHolder>(options) {
        @Override
        public BestBuysViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_best_buys, parent, false);
            return new BestBuysViewHolder(view);
        }

        @Override
        protected void onBindViewHolder(@NonNull BestBuysViewHolder holder, int position, @NonNull BestBuysProducts model) {
            holder.setDetails(getContext(), model.getProduct_name());

        }};

    recView.setLayoutManager(new LinearLayoutManager(getContext()));
    recView.setAdapter(adapter);

}

View Holder Class

public static class BestBuysViewHolder extends RecyclerView.ViewHolder {

    View mView;

    public BestBuysViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
    }


    public void setDetails(final Context ctx, final String productName) {
        TextView titleTextView = itemView.findViewById(R.id.item_best_buys_title);
        titleTextView.setText(productName);
    }

Thank you!

Upvotes: 2

Views: 3393

Answers (1)

Yudi karma
Yudi karma

Reputation: 324

private void firebaseUserSearch(String searchText) {

    /*Toast.makeText(AllUserActivity.this, "Started Search", Toast.LENGTH_LONG).show();*/
    progressBar.setVisibility(View.VISIBLE);


    Query firebaseSearchQuery = mUserDatabase.orderByChild("name").startAt(searchText).endAt(searchText + "\uf8ff");

    //set Options
    FirebaseRecyclerOptions<Users> options =
            new FirebaseRecyclerOptions.Builder<Users>()
                    .setQuery(firebaseSearchQuery, Users.class)
                    .setLifecycleOwner(this)
                    .build();

    adapter = new FirebaseRecyclerAdapter<Users, UserviewHolder>(options) {
        @Override
        protected void onBindViewHolder(@NonNull UserviewHolder holder, int position, @NonNull Users model) {

            holder.setNama(model.getName());

            holder.setstatus(model.getAddress());
            holder.setMcCircleImageView(model.getThumb_image());

            progressBar.setVisibility(View.GONE);





            final String user_id = getRef(position).getKey();

            holder.mView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {


                    if (!user_id.equals(FirebaseAuth.getInstance().getCurrentUser().getUid())){

                        Intent i = new Intent(AllUserActivity.this, ProfilActivity.class);
                        i.putExtra("user_id", user_id);
                        startActivity(i);
                    }else {
                        Intent i = new Intent(AllUserActivity.this, AcountSettings.class);
                        i.putExtra("user_id", user_id);
                        startActivity(i);
                    }

                }
            });
        }

        @NonNull
        @Override
        public UserviewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_singgle_layout, parent, false);
            return new UserviewHolder(mView);
        }
    };

    mListView.setAdapter(adapter);

}

private void closeKeyboard(){
    View view = this.getCurrentFocus();
    if (view != null){
        InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        if (inputMethodManager != null) {
            inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), 0);
        }
    }
}
@Override
protected void onStart() {
    super.onStart();


    //important for fibrebase database ui
    adapter.startListening();




}

@Override
protected void onStop() {
    super.onStop();
    //important for fibrebase database ui
    adapter.stopListening();
}

//VIEW HOLDER
public class UserviewHolder extends RecyclerView.ViewHolder {
    View mView;
    TextView mdisplayname,mstatus ;
    CircleImageView mcCircleImageView;
    public UserviewHolder(View itemView) {
        super(itemView);
        mView = itemView;

        mdisplayname = (TextView) mView.findViewById(R.id.user_singgle_name);
        mstatus  = (TextView) mView.findViewById(R.id.user_single_status);
        mcCircleImageView = (CircleImageView) mView.findViewById(R.id.profil_single_layout);



    }
    public void setNama(String display_name){

        mdisplayname.setText(display_name);

    }
    public void setstatus(String status){
        mstatus.setText(status);
    }
    public  void setMcCircleImageView(final String img_uri){
        //Picasso.with(UsersActivity.this).load(img_uri).placeholder(R.drawable.user).into(mcCircleImageView);
        if (!img_uri.equals("default")){
            Picasso.with(AllUserActivity.this).load(img_uri).networkPolicy(NetworkPolicy.OFFLINE)
                    .placeholder(R.drawable.default_avatar).into(mcCircleImageView, new Callback() {
                @Override
                public void onSuccess() {

                }

                @Override
                public void onError() {
                    Picasso.with(AllUserActivity.this).load(img_uri).placeholder(R.drawable.default_avatar).into(mcCircleImageView);

                }
            });

        }else{
            Picasso.with(AllUserActivity.this).load(R.drawable.default_avatar).into(mcCircleImageView);

        }
    }
}

Upvotes: 2

Related Questions