1

I am trying to search for users via their username from Fire-base database, but when I type the username in the search filed it shows a blank list-view. Here's what I've done so far.

SearchActivity.java

package com.example.logindesign;

import android.content.Context;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.example.logindesign.UserListAdapter;
import com.example.logindesign.users;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Objects;


/**
 * Created by User on 5/28/2017.
 */

public class SearchActivity extends AppCompatActivity {
    private static final String TAG = "SearchActivity";
    private static final int ACTIVITY_NUM = 1;

    private Context mContext = SearchActivity.this;

    //widgets
    private EditText mSearchParam;
    private ListView mListView;

    //vars
    private List<users> mUserList;
    UserListAdapter mAdapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        mSearchParam = (EditText) findViewById(R.id.search);
        mListView = (ListView) findViewById(R.id.listView);
        Log.d(TAG, "onCreate: started.");

        hideSoftKeyboard();

        initTextListener();
    }

    private void initTextListener(){
        Log.d(TAG, "initTextListener: initializing");

        mUserList = new ArrayList<>();

        mSearchParam.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {

                String text = mSearchParam.getText().toString().toLowerCase(Locale.getDefault());
                searchForMatch(text);
            }
        });
    }

    private void searchForMatch(String keyword){
        Log.d(TAG, "searchForMatch: searching for a match: " + keyword);
        mUserList.clear();
        //update the users list view
        if(keyword.length() ==0){

        }else{
            DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
            Query query = reference.child("Users")
                    .orderByChild("Username").equalTo(keyword);
            query.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for(DataSnapshot singleSnapshot :  dataSnapshot.getChildren()){
                        Log.d(TAG, "onDataChange: found user:" + Objects.requireNonNull(Objects.requireNonNull(singleSnapshot.getValue(users.class)).toString()));

                        mUserList.add(singleSnapshot.getValue(users.class));
                        //update the users list view
                        updateUsersList();
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
        }
    }

    private void updateUsersList(){
        Log.d(TAG, "updateUsersList: updating users list");

        mAdapter = new UserListAdapter(SearchActivity.this, R.layout.layout_user_listitem, mUserList);

        mListView.setAdapter(mAdapter);

        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d(TAG, "onItemClick: selected user: " + mUserList.get(position).toString());

                //navigate to profile activity

            }
        });
    }


    private void hideSoftKeyboard(){
        if(getCurrentFocus() != null){
            InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }
    }


}

UserListAdapter.java

package com.example.logindesign;

import android.content.Context;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;


import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;

import java.util.List;
import java.util.Objects;

import de.hdodenhof.circleimageview.CircleImageView;


/**
 * Created by User on 9/17/2017.
 */

public class UserListAdapter extends ArrayAdapter<users> {

    private static final String TAG = "UserListAdapter";


    private LayoutInflater mInflater;
     List<users> mUsers = null;
    private int layoutResource;
    private Context mContext;

    public UserListAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull List<users> objects) {
        super(context, resource, objects);
        mContext = context;
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        layoutResource = resource;
        this.mUsers = objects;

    }

    private static class ViewHolder{
        TextView username, email;


    }


    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {


        final ViewHolder holder;

        if(convertView == null){
            convertView = mInflater.inflate(layoutResource, parent, false);
            holder = new ViewHolder();

            holder.username =  convertView.findViewById(R.id.username);
            holder.email =  convertView.findViewById(R.id.email);



            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }


        holder.username.setText(Objects.requireNonNull(getItem(position)).getUsername());
        holder.email.setText(Objects.requireNonNull(getItem(position)).getEmail());

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
        Query query = reference.child("Users")
                .orderByChild("Username")
                .equalTo(Objects.requireNonNull(getItem(position)).getUser_id());
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot singleSnapshot: dataSnapshot.getChildren()){
                    Log.d(TAG, "onDataChange: found user: " +
                            Objects.requireNonNull(singleSnapshot.getValue(users.class)));






                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

        return convertView;
    }
}

The results are like this. If you look closely you'll see there's a card-view for the info to be displayed but somehow it's hidden:

BSMP
  • 4,596
  • 8
  • 33
  • 44
John
  • 31
  • 3
  • See here:https://stackoverflow.com/questions/59628149/how-to-have-searched-characters-colored-when-we-use-searchview-in-recyclerview It may help you – MMG Mar 25 '20 at 04:18
  • Thanks, but thats kotlin, and im using java :) – John Mar 25 '20 at 04:57
  • You can convert it to Java if you like – MMG Mar 25 '20 at 05:00
  • Thanks, but i don't think so, i'm looking for simple search username function and that seems to a be a lot of coding bc he's doing custom search, but thanks for the help :) – John Mar 25 '20 at 05:05

2 Answers2

2

U need to pass the value of the list here :

  DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
        Query query = reference.child("Users")
                .orderByChild("Username").equalTo(keyword);
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot singleSnapshot :  dataSnapshot.getChildren()){
                    Log.d(TAG, "onDataChange: found user:" + Objects.requireNonNull(Objects.requireNonNull(singleSnapshot.getValue(users.class)).toString()));

                    mUserList.add(singleSnapshot.getValue(users.class));
                    //update the users list view
                    updateUsersList(mUserList);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });




        private void updateUsersList(List<users> mUserList){

               ////

          }
Shimaa Yasser
  • 587
  • 4
  • 12
0

It's for MainActivity.class

    reference = FirebaseDatabase.getInstance().getReference("Users");


    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

                User user = snapshot.getValue(User.class);


                if (user.getUsername().equals(keyword)) {

                 mUserList.add(user);
                //update the users list view
                updateUsersList(mUserList);


                }


            }


        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

and your User class should look like this :

package com.example.spacing.Model;

public class User {

private String username;
private String phone;
private String id;
private String imageURL;

private String email;

public User(String username, String email ,String phone, String id, String imageURL) {
    this.username = username;
    this.email=email;
    this.phone = phone;
    this.id = id;
    this.imageURL = imageURL;
}

public String getImageURL() {
    return imageURL;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public User() {
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPhone() {
    return phone;
}

public void setPhone(String phone) {
    this.phone = phone;
}

}

Shimaa Yasser
  • 587
  • 4
  • 12
  • yea my User Class is good, although now i'm getting an error saying "boolean java.lang.String.equals(java.lang.Object)' on a null object reference" for the "if statment" line – John Mar 25 '20 at 05:24
  • It's just an example of how u can edit it based on your database and your User class – Shimaa Yasser Mar 25 '20 at 06:00