1

I develop a chat app. I try to get data from firebase database and display it in a recyclerview, but it doesn't work. I searched it on Google and I tried a lot of options, but it displays nothing. What am I doing wrong? These are the activities:

1.Main Activity(Where I want to display the data)

public class SearchActivity extends AppCompatActivity {
Toolbar sToolbar;
SearchView searchView;
RecyclerView recyclerView;
BottomNavigationView sBnv;
SearchAdapter searchAdapter;
LinearLayoutManager llm;
ArrayList<String> arrayList;
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);

    sToolbar = findViewById(R.id.sToolbar);
    recyclerView = findViewById(R.id.sRecyclerView);
    sBnv = findViewById(R.id.sBnv);

    searchAdapter = new SearchAdapter(arrayList, getApplicationContext());
    recyclerView.setHasFixedSize(true);
    llm = new LinearLayoutManager(getApplicationContext());

    final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users");

    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    String username = (String)
                            snapshot.child("username").getValue();
                    arrayList.add(username);

                }
                recyclerView.setLayoutManager(llm);
                recyclerView.setAdapter(searchAdapter);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        Toast.makeText(SearchActivity.this, "Database error", Toast.LENGTH_SHORT)
                .show();
        }
    });

2.Adapter class:

public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder> {

ArrayList<String> friendsSearchedList = new ArrayList<>();
Context mContext;

public SearchAdapter(ArrayList<String> friendsSearchedList, Context mContext){
    this.friendsSearchedList = friendsSearchedList;
    this.mContext = mContext;
}

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

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    final String username = friendsSearchedList.get(position);
    holder.text.setText(username);

}

@Override
public int getItemCount() {
return friendsSearchedList == null ? 0:friendsSearchedList.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
TextView text, text1, text2;
Button button;
RelativeLayout relativeLayout;
public ViewHolder(View itemView){
super(itemView);

text = itemView.findViewById(R.id.sText);
button = itemView.findViewById(R.id.addFriend);
text1 = itemView.findViewById(R.id.sText1);
text2 = itemView.findViewById(R.id.sText2);
relativeLayout = itemView.findViewById(R.id.relativeLayout);
    }
}

}

3.User class:

public class User {
public String  email, id, password;
public String username;

public User(String email, String username, String password){
this.email = email;
this.username = username;
this.password = password;
}
public User(){}
public void setUsername(String username){
this.username = username;
}
public String getUsername(){
return username;
}
public void setEmail(String email){
this.email = email;
}
public String getEmail(){
return email;
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password = password;
}

}

RKRK
  • 1,354
  • 5
  • 14
  • 17
snree
  • 17
  • 3
  • What is wrong with this code? Do you have an error? Please add your database sctructure as a JSON or at least as a screenshot. – Alex Mamo May 23 '19 at 13:23

3 Answers3

1

Initially the arraylist which your setting for the recyclerview is empty. When you are adding the data to that list you have to notify the recycler view adapter. So your code should look like this way:

searchAdapter = new SearchAdapter(arrayList, getApplicationContext());
  // remove this line
    /* recyclerView.setHasFixedSize(true);*/
    llm = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(llm);
                recyclerView.setAdapter(searchAdapter);

    final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users");

    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    String username = (String)
                            snapshot.child("username").getValue();
                    arrayList.add(username);

                }
                  ***searchAdapter.notifyDataSetChanged();***

            }
        }
0

If it’s a simple chat maybe a listview would be more convenient for you.

databaseReference.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
       String value = dataSnapshot.getValue(String.class);
       list.add(value);
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

This should easily do the trick…

MarkWalczak
  • 1,243
  • 3
  • 11
  • 20
0

Create a method in your SearchAdapter.class like below

 public void addData(ArrayList<String> list){
        this.mDataSet = list;
        notifyDataSetChanged();
    }

And once you receive data from Firebase database, update it to the adapter like below.You need to tell the recycler view that your data set has been updated.

ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    String username = (String)
                            snapshot.child("username").getValue();
                    arrayList.add(username);                      
                }
                recyclerView.setLayoutManager(llm);
                recyclerView.setAdapter(searchAdapter);
                searchAdapter.addData(arrayList); // Add this line 
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        Toast.makeText(SearchActivity.this, "Database error", Toast.LENGTH_SHORT)
                .show();
        }
    });
VP4Android
  • 556
  • 3
  • 16