【问题标题】:Firebase data populated to Listview, how to getKey() of selected Listview item?Firebase 数据填充到 Listview,如何获取所选 Listview 项的 getKey()?
【发布时间】:2018-09-18 23:26:28
【问题描述】:

我想为列表视图中选择的项目用户运行 getKey(),以便我可以使用此键来确定将用户带到哪里,我尝试了很多 stackoverflow 解决方案,但失败了许多不同的错误.. . 非常感谢您的帮助,非常感谢!

详情如下:

  1. Firebase 数据填充到适配器列表视图 -- 没有错误

    UserId = FirebaseAuth.getInstance().getCurrentUser().getUid();
    final DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference gameInfoRef = rootRef.child("user").child(UserId).child("gameInfo");
    
    gameInfoRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
    
            ListView lv_SelectGame = findViewById(R.id.lv_SelectGame);
            GameList.clear();
    
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                Game game = ds.getValue(Game.class);
                GameList.add(game);
            }
    
            History_SelectGameAdapter adapter = new History_SelectGameAdapter(ida_History_SelectGame.this, GameList);
            lv_SelectGame.setAdapter(adapter);
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
            // Getting Post failed, log a message
        }
    });
    
  2. 用户点击 Listview 项,返回该特定游戏的密钥(由之前在其他活动中的 push() 生成,存储在 firebase 中) -- 请告知解决方案,谢谢!

Firebase 数据:(列表视图中的每个项目都按日期显示)

 gameInfo
    -LMIdDTDiUd3ajVVMdzC
          gameDate: "2018-09-01"    
          gameMode: "SomeMode"

    -LMOGEUbCTsaeywPICqi
          gameDate: "2018-09-06"    
          gameMode: "SomeMode"

    -LMQfCQ7TO21WP3qW7v3
          gameDate: "2018-09-15"    
          gameMode: "SomeMode"

现在是我不知道怎么写的部分,谢谢!

(当我点击 Listview 项时,Toast 显示没有任何错误,但我不知道如何获取位置并基于它运行 getKey())

    lv_SelectGame.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
            ListView lv_SelectGame = findViewById(R.id.lv_SelectGame);

            Toast.makeText(ida_History_SelectGame.this, "getKey() of this item", Toast.LENGTH_SHORT).show();

        }

【问题讨论】:

    标签: android firebase listview


    【解决方案1】:

    您想要像 LMIdDTDiUd3ajVVMdzC、LMOGEUbCTsaeywPICqi 之类的 ID...?

    那么你要做的就是为你的对象游戏键添加一个新属性(如果你没有的话)。

    当你从 Firebase 获取数据时,获取 id 并将其添加到对象 Game:

    for (DataSnapshot ds : dataSnapshot.getChildren()) {
                Game game = ds.getValue(Game.class);
    
                String idYouWant = String.valueOf(ds.getKey());
                //We add to the object game
                game.setKey(idYouWant)
    
                GameList.add(game);
    }
    

    最后你只需要从你的数组 GameList 中获取它,如下所示:

    lv_SelectGame.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
                Game game = GameList.get(position);
                String key = game.getKey();
                Toast.makeText(ida_History_SelectGame.this, "getKey() of this item", Toast.LENGTH_SHORT).show();
    
            }
    

    【讨论】:

    • 感谢您的建议,我遇到了 "Cannot resolve method getId()" ,我想您的意思是我应该在 Game.class 中为 "Id" 和 "Key" 插入一个 getter 和 setter ? @亚历克斯豆
    • 对不起,我已经编辑了答案,用这个: String idYouWant = String.valueOf(ds.getKey());不应该有任何错误。是的,getter 和 setter 拥有游戏对象的 id,您可以将所有内容存储在数组中
    • 我从来不知道用这种逻辑可以做到这一点!完美运行,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多