首页 > 解决方案 > 从 Firebase 数据库 Android 获取密钥

问题描述

我有如下的firebase数据。单击 ListView 时,我想在 textview 中显示键。

在此处输入图像描述

我尝试使用以下代码从折扣中获取密钥

private void getKeyValues(){

    databaseReference = FirebaseDatabase.getInstance().getReference().child("promotion").child("discount");

    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String key = dataSnapshot.getKey();

            for (DataSnapshot child: dataSnapshot.getChildren()){
                //Object object = child.getKey();
                labelGetKey.setText(child.getKey());
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e("Read Fail", "Error");
        }
    });
}

它正在工作,但只能获得最后一个键并在文本视图中显示。第一个键或其他键没有显示。这是我的列表视图代码

private void retrieveDataShowListView(){
    // Array List and Adapter for Message ListView;
    final ArrayList<String> arrayList = new ArrayList<>();
    final ArrayAdapter<String> adapter;

    databaseReference = FirebaseDatabase.getInstance().getReference().child("promotion").child("discount");

    adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,arrayList);
    listViewPromotion.setAdapter(adapter);
    listViewPromotion.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            String showValue = String.valueOf(parent.getItemAtPosition(position));
            editTextPromotion.setText(showValue);

            // Display Key from Database
            getKeyValues();
        }
    });

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

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

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            String string = dataSnapshot.getValue(String.class);
            arrayList.remove(string);
            adapter.notifyDataSetChanged();
        }

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

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });
}

你能帮我看看我的代码有什么错误吗?谢谢!

标签: androidfirebasefirebase-realtime-database

解决方案


好吧,你要做的只有一件事,

private void getKeyValues(){

databaseReference = FirebaseDatabase.getInstance().getReference().child("promotion").child("discount");

databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String key = dataSnapshot.getKey();
        String dataKeys="";

        for (DataSnapshot child: dataSnapshot.getChildren()){
            //Object object = child.getKey();

            dataKeys=dataKeys+child.getKey() + "";
        }
        labelGetKey.setText(dataKeys);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.e("Read Fail", "Error");
    }
});
}

您的密钥每次在您的 for 循环中都会被覆盖。因此,您必须将每个位置的每个键存储在字符串中并附加它。因此,您将在 String dataKeys 中获得最终的键值。

因此,要获取所选列表视图项目的字符串,您可以通过项目位置获取,例如,如果 position is=2;

所以,你可以这样做,

        int counter=0;
        for (DataSnapshot child: dataSnapshot.getChildren()){
            //Object object = child.getKey();
            if(counter==position-1){
                dataKeys=child.getKey();
                break;
            }
            counter++;
        }
            labelGetKey.setText(dataKeys);

通过这种方式,您可以通过传递列表项位置找到所选项目的键。我希望你能明白。......


推荐阅读