【问题标题】:How can I put correctly data from Firebase database to my RecyclerView?如何将 Firebase 数据库中的正确数据放入我的 RecyclerView?
【发布时间】:2020-06-21 19:49:26
【问题描述】:

我正在 Android Studio 中创建一个连接到 Firebase 实时数据库的应用。在数据库中,我有以下结构:

第一件事:我更喜欢这样的结构:

users -> email -> {23, 13, 4, .., 5} 但我发现使用 Firebase 我必须有一对 key - value 所以我无法获得这种结构。我说的对吗?!

无论如何.. 我创建了一个这样的类:

public class ItemModel {

    private int itemImg;
    private int deleteFav;
    private String itemLine;

    public ItemModel(){}

    public ItemModel(String itemLine) {
        this.itemLine = itemLine;
    }

    public ItemModel(int itemImg,  String itemLine, int deleteFav) {
        this.itemImg = itemImg;
        this.deleteFav = deleteFav;
        this.itemLine = itemLine;
    }

    public int getItemImg() {
        return itemImg;
    }

    public int getDeleteFav() {
        return deleteFav;
    }

    public String getItemLine() {
        return itemLine;
    }

    @Override
    public String toString() {
        return itemLine;
    }
}

这是我的 Firebase 数据库助手类:

public class FirebaseDatabaseHelper {

    private FirebaseDatabase firebaseDatabase;
    private DatabaseReference databaseReferenceFavorites;
    private List<ItemModel> favouriteList = new ArrayList<>();
    private FirebaseAuth mAuth;

    // In order to link our process we need to create interface
    public interface  DataStatus {
        void DataIsLoaded(List<ItemModel> favourites, List<String> keys);
    }

    public FirebaseDatabaseHelper(){
        mAuth = FirebaseAuth.getInstance();
        firebaseDatabase = FirebaseDatabase.getInstance();
        databaseReferenceFavorites =  firebaseDatabase.getReference("users");
    }

    public void readFavoriteLines(final DataStatus dataStatus){
        databaseReferenceFavorites.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {  // asincrono
                favouriteList.clear();
                List<String> keys = new ArrayList<>();
                for (DataSnapshot keyNode : dataSnapshot.getChildren()){
                    keys.add(keyNode.getKey());
                    ItemModel favourite = keyNode.getValue(ItemModel.class);
                    favouriteList.add(favourite);
                }

                dataStatus.DataIsLoaded(favouriteList, keys);
            }

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

            }
        });
    }

    static String encodeUserEmail(String userEmail) {
        return userEmail.replace(".", ",");
    }
}

当我运行时,我从这个类中得到错误“No setter/field for test@email,com found on class com.example.x.y.ItemModel”。我在这里读到其他人遇到此错误,但无法理解我的代码的哪一部分不正常。我尝试添加设置器并将数据库中“v1”的名称更改为“itemLine”,但仍然出现相同的错误。

问题是,当我运行时,我的项目实际上出现在 UI 中,但它错过了一个数据,即 itemLine。该行必须是 img1 - itemLine - img2 但它只显示 img1 - 无 - img2。我只需要获取每个 test@email,com (itemLine) 的值并将这个值(例如 23)放在我的 RecyclerView 项目中。该行应如下所示:

【问题讨论】:

    标签: java android firebase firebase-realtime-database android-recyclerview


    【解决方案1】:

    这不会显示任何内容,因为您试图从用户而不是 test@email,com 获取价值

    试试这个

    不是这个

    databaseReferenceFavorites =  firebaseDatabase.getReference("users");
        
    

    这应该会获取您的数据 创建对该位置的数据库引用

    public FirebaseDatabaseHelper(){
            mAuth = FirebaseAuth.getInstance();
            firebaseDatabase = FirebaseDatabase.getInstance();
           DatabaseReference databaseReferenceFavorites =  
           firebaseDatabase.getReference("users");
           DatabaseReference databaseReferenceitemline = 
           databaseReferenceFavorites.child("test@gmail,com")
    }
    public void readFavoriteLines(final DataStatus dataStatus){
            databaseReferenceitemline.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {  // asincrono
                    favouriteList.clear();
                    List<String> keys = new ArrayList<>();
                    for (DataSnapshot keyNode : dataSnapshot.getChildren()){
                        keys.add(keyNode.getKey());
                        ItemModel favourite = keyNode.getValue(ItemModel.class);
                        favouriteList.add(favourite);
                    }
    
                    dataStatus.DataIsLoaded(favouriteList, keys);
                }
    
                @Override
                public void onCancelled(@NonNull DatabaseError error) {
    
                }
            });
        }
    
        static String encodeUserEmail(String userEmail) {
            return userEmail.replace(".", ",");
        }
    }
    

    在这个sn-p中

    • databaseReferenceFavorites 指向用户
    • databaseReferenceitemline 指向 test@gmail,com

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2017-07-24
      • 2017-10-19
      相关资源
      最近更新 更多