首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单击Spinner项并获取所选的spinner项数据

单击Spinner项并获取所选的spinner项数据
EN

Stack Overflow用户
提问于 2020-07-25 05:59:17
回答 1查看 580关注 0票数 0

在应用程序中,我有一个旋转器,旋转器有一些选项,这个选项存储在firebase中,这个选项显示得很好,但是当我单击spinner项时,它在数据库的textview中显示了一些字符串。但什么都没显示出来。假设我有两个数据,第一个是名称,第二个是年龄,我在spinner项中显示名称,当我单击spinner时,它在文本视图中显示年龄。

代码语言:javascript
复制
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) {

        }
    });
}

我的数据库结构

如何在文本视图中显示这些数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-25 15:12:17

在为适配器从数据库中读取数据时,应保留所需的所有数据。这包括名称、年龄以及键,如果您想要更新/删除数据,就需要这个键。这也使您不必在用户选择旋转器中的项目时进行额外的数据加载,因为应用程序中已经有了所有的数据。

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

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

代码语言:javascript
复制
nameList = new ArrayList<>();
ageList = new ArrayList<>();
keyList = new ArrayList<>();

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

代码语言:javascript
复制
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
    }
});

现在,当用户单击旋转器中的项时,可以根据所选项的索引查找相应的年龄和键:

代码语言:javascript
复制
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) {
    }
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63084920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档