"setOnItemSelectedListener()" 在微调器中选择项目时未调用
"setOnItemSelectedListener()" not called when selecting item in spinner
我正在创建一个用于酒店管理的 android 应用程序。
我想以微调器的形式向用户显示可用房间的数量。
我正在 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) {
}
});
问题是如果我 select 微调器中的任何项目都不会调用 setOnItemSelectedListener()
。
因此 strRoomNumber
将变为空。我将使用 strRoomNumber
将其存储在 firebase 数据库中。
这是我的全部code
可能是什么问题?
您的 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
尝试将设置适配器的代码移动到 documentReference.get().addOnSuccessListener .......
之前和 onSuccess 方法内部,将其添加为最后一行:adapterRoomNumbers.notifyDataSetChanged();
解释:适配器未正确更新,因为调用 firebase 是一个异步过程。
我正在创建一个用于酒店管理的 android 应用程序。
我想以微调器的形式向用户显示可用房间的数量。
我正在 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) {
}
});
问题是如果我 select 微调器中的任何项目都不会调用 setOnItemSelectedListener()
。
因此 strRoomNumber
将变为空。我将使用 strRoomNumber
将其存储在 firebase 数据库中。
这是我的全部code
可能是什么问题?
您的 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
尝试将设置适配器的代码移动到 documentReference.get().addOnSuccessListener .......
之前和 onSuccess 方法内部,将其添加为最后一行:adapterRoomNumbers.notifyDataSetChanged();
解释:适配器未正确更新,因为调用 firebase 是一个异步过程。