从Android Firebase数据库获取密钥

时间:2018-08-10 06:48:42

标签: android firebase firebase-realtime-database

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

enter image description here

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

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

它正在工作,但是仅获得最后一个键并在textview中显示。第一个键或其他键未显示。 这是我的listview代码

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

您能帮我解决我的代码有什么错误吗?谢谢!

2 个答案:

答案 0 :(得分:1)

好的,您只需要做的一件事,

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为= 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);

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

答案 1 :(得分:0)

我不知道这是您要完成的工作,但是,您可以在设置textView的最里面的for循环中构建一个字符串。

filterMap = map;

但是,这是一个非常糟糕的方法。如果要单独显示每个键,可以尝试在ListView布局中使用另一个 ListView 。除了可视化之外,这种方法不允许您单独使用每个键。

希望这会有所帮助。