简体   繁体   English

在微调器中选择项目时未调用“setOnItemSelectedListener()”

[英]"setOnItemSelectedListener()" not called when selecting item in spinner

I'm creating an android app which is used for hotel management.我正在创建一个用于酒店管理的 android 应用程序。

I want to show the user, the number of rooms available in the form of spinner.我想以微调器的形式向用户显示可用房间的数量。

I'm storing the details(roomNumber, name address etc..) in google firebase.我在谷歌 firebase 中存储详细信息(房间号、姓名地址等)。

If the user is logging in the app for first time then all the room numbers in spinner should be visible.如果用户是第一次登录应用程序,那么微调器中的所有房间号都应该是可见的。 But if the user has already booked a room then that room number should not be visible in spinner.但是,如果用户已经预订了房间,那么该房间号不应在微调器中可见。

Here is the java code:这是 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");
                   }

               }
           }
       });

If the room is already booked then roomNumberDocument will not be null else it will be null.如果房间已经被预订,那么roomNumberDocument将不是 null,否则它将是 null。

If the room is already booked then I will not add it into the ArrayList roomNumbersList .如果房间已经预订,那么我不会将其添加到 ArrayList roomNumbersList

Here I'm setting up the adapter:我在这里设置适配器:

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

Here is the click listener for the spinner:这是微调器的点击侦听器:

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

            }
        });

The problem is that setOnItemSelectedListener() is not called if I select any item in the spinner.问题是,如果我 select 微调器中的任何项目,则不会调用setOnItemSelectedListener()

Because of that strRoomNumber is getting null. I will use strRoomNumber for storing it in the firebase database.因为strRoomNumber得到 null。我将使用strRoomNumber将它存储在 firebase 数据库中。

Here is my full code这是我的完整代码

What might be the problem?可能是什么问题?

Try move the codes for setting up the adapter to just before documentReference.get().addOnSuccessListener....... and inside onSuccess method, add this as the last line: adapterRoomNumbers.notifyDataSetChanged();尝试将设置适配器的代码移动到documentReference.get().addOnSuccessListener.......并在onSuccess方法内,将其添加为最后一行: adapterRoomNumbers.notifyDataSetChanged();

Explanation: Adapter is not updated correctly as calls to firebase is an async process.解释:适配器未正确更新,因为对 firebase 的调用是一个异步过程。

your setOnItemSelectedListner must look like this:您的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) {

        }
    });

also check this out for more info setOnItemSelectedListener of Spinner does not call另请查看此以获取更多信息Spinner 的 setOnItemSelectedListener 不会调用

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM