【问题标题】:How to get data from Firebase and display it in a recyclerview? [duplicate]如何从 Firebase 获取数据并将其显示在 recyclerview 中? [复制]
【发布时间】:2019-10-10 02:06:21
【问题描述】:

我开发了一个聊天应用程序。我尝试从 firebase 数据库中获取数据并将其显示在 recyclerview 中,但它不起作用。我在谷歌上搜索了它,我尝试了很多选项,但它什么也没显示。我究竟做错了什么? 这些是活动:

1.Main Activity(我要显示数据的地方)

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;
}

}

【问题讨论】:

  • 这段代码有什么问题?你有错误吗?请将您的数据库结构添加为 JSON 或至少作为屏幕截图。

标签: android firebase android-recyclerview


【解决方案1】:

最初,您对 recyclerview 的设置为空的数组列表。当您将数据添加到该列表时,您必须通知回收器视图适配器。所以你的代码应该是这样的:

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();***

            }
        }

【讨论】:

    【解决方案2】:

    如果这是一个简单的聊天,也许列表视图对你来说会更方便。

    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) {
    
        }
    });
    

    这应该很容易解决问题……

    【讨论】:

      【解决方案3】:

      在您的SearchAdapter.class 中创建一个方法,如下所示

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

      一旦您从 Firebase 数据库接收到数据,请将其更新到适配器,如下所示。您需要告诉回收者视图您的数据集已更新。

      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();
              }
          });
      

      【讨论】:

        猜你喜欢
        • 2020-05-09
        • 1970-01-01
        • 2021-11-07
        • 2021-05-05
        • 2022-01-24
        • 2020-07-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多