List
для ArrayAdapter
, используемого в моем Spinner, инициализируется с 1 значением: var users: MutableList<String> = mutableListOf(currentUser)
.Остальные данные являются динамическими, взятыми из базы данных Google Firestore.
Когда я начинаю свою деятельность, данные из базы данных еще не загружены, поэтому отображается только начальное значение:
В этом состоянии дизайн выглядит именно так, как я хочу, с выпадающим списком, начинающимся с Spinner.
Однако, когда я загружаю свои данные, дизайн сбивается и выдвигается кверхняя часть экрана:
Вот мой код:
<Spinner
android:id="@+id/choose_user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="100dp"
android:layout_marginEnd="8dp"
app:layout_constraintHorizontal_bias="0.08" android:layout_marginTop="56dp"
app:layout_constraintTop_toTopOf="parent"
android:shadowColor="@color/colorGreen" />
class PlayerDetails : AppCompatActivity(), View.OnClickListener, TextWatcher, AdapterView.OnItemSelectedListener {
val TAG: String = "PlayerDetails"
val FirebaseTAG: String = "FirebaseDebug"
var numOfPlayers: Int = 1
var currentPlayer: Int = 1
var name: String = ""
var age: Int = 0
var genderId: Int = 0
var genderResult: String = ""
val db = FirebaseFirestore.getInstance()
var currentUser: String = "Player $currentPlayer"
var users: MutableList<String> = mutableListOf(currentUser)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val sharedPref = this@PlayerDetails.getPreferences(Context.MODE_PRIVATE)
val applicationID: String? = sharedPref.getString("applicationID", null)
setContentView(R.layout.activity_player_details)
if (applicationID != null) {
db.collection("phones").document(applicationID)
.collection("users")
.get()
.addOnSuccessListener { result ->
for (document in result){
val name = document.get("name").toString()
users.add(name)
}
}
.addOnFailureListener { failure -> Log.e("Failure", "crashing", failure) }
val spinnerAdaptor = ArrayAdapter<String>(this@PlayerDetails, R.layout.truthordare_spinner_item, users)
spinnerAdaptor.setDropDownViewResource(R.layout.truthordare_spinner_dropdown_item)
choose_user?.adapter = spinnerAdaptor
choose_user.onItemSelectedListener = this@PlayerDetails
}
val intent = getIntent()
numOfPlayers = intent.getIntExtra("number_of_players", 1)
next_details.setOnClickListener(this)
player_name.addTextChangedListener(this)
player_age.addTextChangedListener(this)
gender.setOnCheckedChangeListener(object: RadioGroup.OnCheckedChangeListener {
override fun onCheckedChanged(radiogroup: RadioGroup, checked: Int) {
if (fieldsArePopulated()) next_details.visibility = View.VISIBLE
}
})
}
override fun onItemSelected(parent: AdapterView<*>?, name: View?, position: Int, rowId: Long) {
Log.d("dropDownHorizontalOffset", choose_user.dropDownHorizontalOffset.toString())
}
override fun onNothingSelected(parent: AdapterView<*>?) {
}
...
Я использую свой собственный элемент прядильщика xmlи xml dropdown (они добавляются к ArrayAdapter
, как вы можете видеть выше), однако, только для изменений цвета и размера текста на самом деле - с точки зрения позиционирования они совершенно такие же, как файлы по умолчанию:
trueordare_spinner_dropdown_item.xml
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerDropDownItemStyle"
android:textColor="@color/colorGreen"
android:singleLine="true"
android:layout_width="match_parent"
android:textSize="@dimen/dropdown_text_size"
android:layout_height="?dropdownListPreferredItemHeight"
android:paddingHorizontal="3dp"
android:paddingVertical="5dp"
android:ellipsize="marquee"/>
trueordare_spinner_item.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerItemStyle"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:textSize="24sp"
android:textColor="@color/colorGreen"
android:textAlignment="inherit"/>
Как я могу предотвратить перемещение позиции моего раскрывающегося меню после загрузки данных