【问题标题】:OnItemSelected Won't call when Spinner is getting arraylist from Firebase当 Spinner 从 Firebase 获取数组列表时,OnItemSelected 不会调用
【发布时间】:2017-11-03 08:21:08
【问题描述】:

该应用通过OnDataChange 从 Firebase 获取一个数组列表并拥有OnItemSelected,但不幸的是它不会调用。 (实际上微调器正在从 Firebase 数据库中获取字符串。) 我已经使用本地数组列表测试了代码,OnItemSelected 有效。 为什么?

这些是我的功能:

        public void initSpinner() {

        restartAudioSpinner();


        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(AddAudioItems.this, android.R.layout.simple_spinner_dropdown_item, categoriesTitle);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(this);

    }




   public void restartAudioSpinner() {
        DatabaseReference database;
        database = FirebaseDatabase.getInstance().getReference("Audio Categories");

        database.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                categorylist = new ArrayList<String>();

                for (DataSnapshot data :dataSnapshot.getChildren()) {
                    CategoryNew category = data.getValue(CategoryNew.class);
                    categoriesList.add(new CategoryNew(category.getImageUrl(),category.getTitle()));
                }

                for (int i = 0; i < categoriesList.size(); i++) {
                    categoriesTitle.add(categoriesList.get(i).getTitle());
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        Toast.makeText(AddAudioItems.this, categoriesTitle.get(i), Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {
        Toast.makeText(AddAudioItems.this, "לא נבחרה שום רשומה, אנא בחר קטגוריה", Toast.LENGTH_SHORT).show();

    }

【问题讨论】:

  • 微调器是否填充了数据列表?如果那是在主标题上,你不应该这样做Thread.sleep(4000);
  • 是的,你可以在这里看到完整的代码:pastebin.com/hSH0dfuB
  • 你在主线程上做Thead.sleep(4000);,你应该在加载时等待回调中的数据。

标签: java android firebase arraylist spinner


【解决方案1】:

最终我自己找到了答案。 Firebase 函数异步工作。我还没有找到改变它的方法 - 以某种方式操纵它。 使用从 firebase 函数接收到的数据的答案是在 for(从数据库中收集信息)INSIDE onDataChange 之后初始化所需的函数。 例如:

   public void restartAudioSpinner() {
    DatabaseReference database;
    database = FirebaseDatabase.getInstance().getReference("Audio Categories");

    database.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            categorylist = new ArrayList<String>();

            for (DataSnapshot data :dataSnapshot.getChildren()) {
                CategoryNew category = data.getValue(CategoryNew.class);
                categoriesList.add(new CategoryNew(category.getImageUrl(),category.getTitle()));
            }

            for (int i = 0; i < categoriesList.size(); i++) {
                categoriesTitle.add(categoriesList.get(i).getTitle());
            }
                 **// PUT THE DESIRED FUNCTION HERE!!!** EX: INIT THE SPINNER
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多