【问题标题】:Click Spinner Item and fetch the spinner selected item data单击 Spinner Item 并获取 spinner 选定的项目数据
【发布时间】:2020-07-25 05:59:17
【问题描述】:

在应用程序中,我有一个微调器,微调器有一些选项,并且此选项存储在 firebase 中,该选项显示正常,但是当我单击微调器项目时,它会在数据库中的 textview 中显示一些字符串。但它什么也没显示。假设我有两个数据,第一个是名称,第二个是年龄,我在微调器项目中显示名称,当我单击微调器时,它会在 textview 中显示年龄

list = new ArrayList<>();
    retriveData();
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
            String selected = list.get(position).toString();
            Log.e("Clicked:",""+selected);
            reference.child("result").child(selected).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    for (DataSnapshot ds : snapshot.getChildren()) {

                        String fAge = ds.child("age").getValue(String.class);
                        
                        tv_1st.setText(fAge);
                    }
                }

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

                }
            });
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }

    });

}

public void retriveData() {
    reference.child("result").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            list.clear();
            for (DataSnapshot item : snapshot.getChildren()) {
                list.add(item.child("name").getValue().toString());
            }
            adapter = new ArrayAdapter<String>(MainActivity.this, R.layout.spinner_style, list);
            Collections.reverse(list);
            spinner.setAdapter(adapter);
        }

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

        }
    });
}

我的数据库结构

如何在 textview 中显示这些数据?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    当您从数据库中为适配器读取数据时,您应该保留所有需要的数据。这包括姓名、年龄以及密钥,如果您想更新/删除数据,您将需要这些信息。这也使您不必在用户选择微调器中的项目时进行额外的数据加载,因为您已经在应用程序中拥有了所有数据。


    最好的方法是保留一个DataSnapshot 对象数组,而不仅仅是一个名称数组。然后在微调器的布局中,您只需从每个 DataSnapshot 中获取 name 属性,就像现在在 onDataChange 中所做的那样。


    根据您当前的代码,一种不太漂亮但更容易显示的方法是将名称、年龄和键保存在一堆数组中:

    nameList = new ArrayList<>();
    ageList = new ArrayList<>();
    keyList = new ArrayList<>();
    

    然后在加载数据时填充所有这些:

    reference.child("result").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            list.clear();
            for (DataSnapshot item : snapshot.getChildren()) {
                nameList.add(item.child("name").getValue(String.class));
                ageList.add(item.child("age").getValue(Long.class));
                keyList.add(item.getKey());
            }
            adapter = new ArrayAdapter<String>(MainActivity.this, R.layout.spinner_style, nameList);
            Collections.reverse(nameList);
            spinner.setAdapter(adapter);
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            throw error.toException(); // never ignore erros
        }
    });
    

    现在当用户在spinner中点击一个item时,可以根据选中item的index查找对应的age和key:

    
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
            String selected = nameList.get(position).toString();
            Log.e("Clicked:",""+selected);
            String fAge = ageList.get(position).toString();        
            tv_1st.setText(fAge);
        }
    
        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {
        }
    });
    
    

    【讨论】:

    • 太好了,你的回答真的很有帮助
    猜你喜欢
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多