我开发了一个聊天应用。我试图从firebase数据库中获取数据,并将其显示在回收视图中,但它不起作用。我在谷歌上搜索了一下,尝试了很多选项,但什么都没有显示。我做错了什么?以下是活动:
1.主活动(我想要显示数据的地方)
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.适配器类:
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.用户类:
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;
}
}
发布于 2019-05-23 19:27:11
最初的数组列表,您的回收站视图设置为空。将数据添加到该列表时,必须通知回收者视图适配器。所以你的代码应该是这样的:
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();***
}
}
发布于 2019-05-23 13:32:51
如果这是一次简单的聊天,那么列表视图对你来说可能更方便。
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) {
}
});
这应该可以很容易地完成…的任务
发布于 2019-05-23 19:26:06
在SearchAdapter.class
中创建一个方法,如下所示
public void addData(ArrayList<String> list){
this.mDataSet = list;
notifyDataSetChanged();
}
一旦您从Firebase数据库接收到数据,将其更新到适配器,如below.You,需要告诉回收器视图您的数据集已经更新。
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();
}
});
https://stackoverflow.com/questions/56276230
复制