【问题标题】:"setOnItemSelectedListener()" not called when selecting item in spinner在微调器中选择项目时未调用“setOnItemSelectedListener()”
【发布时间】:2020-09-26 23:43:17
【问题描述】:

我正在创建一个用于酒店管理的安卓应用。

我想以微调器的形式向用户显示可用房间的数量。

我将详细信息(房间号、姓名地址等)存储在 google firebase 中。

如果用户是第一次登录应用程序,那么微调器中的所有房间号都应该可见。但是,如果用户已经预订了房间,那么该房间号不应该在微调器中可见。

这里是java代码:

documentReference.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
           @Override
           public void onSuccess(DocumentSnapshot documentSnapshot) {
               if(documentSnapshot.exists()){
                   roomNumberDocument=documentSnapshot.getString("RoomNumber");
                   if(roomNumberDocument!=null){
                       for (int i = 100; i < 111; i++) {
                           if(Integer.parseInt(roomNumberDocument)==i){
                               continue;
                           }
                           roomNumbersList.add(Integer.toString(i));
                       }
                   }else{
                       //room numbers
                       roomNumbersList.add("100");
                       roomNumbersList.add("101");
                       roomNumbersList.add("102");
                       roomNumbersList.add("103");
                       roomNumbersList.add("104");
                       roomNumbersList.add("105");
                       roomNumbersList.add("106");
                       roomNumbersList.add("107");
                       roomNumbersList.add("108");
                       roomNumbersList.add("109");
                       roomNumbersList.add("110");
                   }

               }
           }
       });

如果房间已被预订,则roomNumberDocument 不会为空,否则将为空。

如果房间已经订好了,我不会把它添加到ArrayList roomNumbersList

我在这里设置适配器:

adapterRoomNumbers= new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, roomNumbersList);
        adapterRoomNumbers.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinnerRoomNumber.setAdapter(adapterRoomNumbers);

这里是微调器的点击监听器:

spinnerRoomNumber.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                strRoomNumber= adapterView.getItemAtPosition(i).toString();
                Toast.makeText(context, ""+strRoomNumber, Toast.LENGTH_LONG).show();
                Log.i(TAG, strRoomNumber);
            }

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

            }
        });

问题是如果我在微调器中选择任何项目,setOnItemSelectedListener() 不会被调用。

因为strRoomNumber 正在变为空。我将使用strRoomNumber 将其存储在firebase 数据库中。

这是我完整的code

可能是什么问题?

【问题讨论】:

  • 尝试将设置适配器的代码移到 documentReference.get().addOnSuccessListener ....... 之前和 onSuccess 方法的最后一行:adapterRoomNumbers.notifyDataSetChanged();
  • 成功了!你能把这个作为答案吗?

标签: java android spinner


【解决方案1】:

尝试将设置适配器的代码移至 documentReference.get().addOnSuccessListener ....... 之前和 onSuccess 方法内,将其添加为最后一行:adapterRoomNumbers.notifyDataSetChanged();

说明:适配器未正确更新,因为对 firebase 的调用是异步进程。

【讨论】:

【解决方案2】:

您的setOnItemSelectedListner 必须如下所示:

 spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view,
                int i, long id) {
            strRoomNumber = adapterView.getItemAtPosition(i).toString;
            if (item != null) {
                Toast.makeText(MainActivity.this, item.toString(),
                        Toast.LENGTH_SHORT).show();
            }
            Toast.makeText(MainActivity.this, ""+strRoomNumber,  Toast.LENGTH_LONG).show();
            Log.i(TAG, strRoomNumber);

        }

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

        }
    });

还可以查看此以获取更多信息 setOnItemSelectedListener of Spinner does not call

【讨论】:

  • 上面的代码不工作!!在我的代码中 setOnItemSelectedListner 没有被调用
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多