Спиннер не отображается должным образом - PullRequest
1 голос
/ 10 июля 2020

У меня два спиннера. Они так выглядят. Я не знаю, почему значок выпадающего меню находится далеко от текста.

(Chagned image after gravity attribute is set to "end")

In my activity_main.xml it is written:

  ... 

SpinnerAdapter. java class:

public class SpinnerAdapter extends ArrayAdapter<String> {

public SpinnerAdapter(@NonNull Context context, ArrayList<String> items) {
    super(context,0, items);
}


@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    return initView(position, convertView, parent);
}

@Override
public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    return initView(position, convertView, parent);
}


private View initView(int position, View convertView, ViewGroup parent){
    if (convertView == null){
        convertView = LayoutInflater.from(getContext()).inflate(
                R.layout.spinner_item, parent, false
        );
    }

    TextView spinnerTextView = (TextView) convertView;
    spinnerTextView.setText(getItem(position));
    spinnerTextView.setGravity(Gravity.END); //This line is added later

    return convertView;
}
}

и файл spinner_item. xml, который представляет собой макет элементов счетчика:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<Spinner
    android:id="@+id/my_spinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

У меня нет опыта работы со спиннерами. Я изучаю. Интересно, почему я столкнулся с такой ошибкой.

Не: у меня есть EDITED spinner_item. xml file:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spinner_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="3dp"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:background="@drawable/suggestions_bg"
android:textColor="@color/blue_popular" />

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

У меня была аналогичная проблема, чтобы решить ее, мне пришлось установить атрибут gravity в счетчике. android:gravity="end" - это помогает отображать элементы рядом со значком раскрывающегося списка.

Затем мне пришлось переопределить getDropDownView в моем классе адаптера следующим образом:

public View getDropDownView(int position, View convertView,ViewGroup parent) 
{
    View v = super.getDropDownView(position, convertView,parent);
    ((TextView) v).setGravity(Gravity.END);
    return v;
}

Это помогает отображать элементы рядом со значком раскрывающегося списка, когда Spinner развернут. Ваш spinner_item также TextView, поэтому я думаю, вы можете просто скопировать и вставить эту функцию.

0 голосов
/ 10 июля 2020

Ваш spinner_item.xml файл не должен снова содержать Spinner, просто TextView будет достаточно, но если вам нужен необычный макет, вы можете использовать другие виджеты, такие как ImageView. Ниже приводится пример простейшего файла spinner_item.xml.

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/custom_text_1"
    style="?android:attr/spinnerItemStyle"
    android:singleLine="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"
    android:textAlignment="inherit" />  

Теперь, избавьтесь от реализации класса SpinnerAdapter. Мы можем использовать ArrayAdapter как адаптер Spinner, например:

// bind your spinner layout from file to a spinner object
Spinner spinner = findViewById(R.id.map_spinner_sector);

// string array which is the content of the spinner
// if you already have array or list object, then this 
// is not needed.
ArrayList<String> spinnerStringArray = ...; // populate the array backing your adapter

// if you have string array resources in file, 
// use ArrayAdapter.createFromResource() method to get your array adapter
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
                R.layout.spinner_item, spinnerStringArray);

spinner.setAdapter(spinnerAdapter);

// set listener to handle item selected event
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Log.d("Item Selected : ", spinnerStringArray[position]);
            }

            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
...