2016-10-12 3 views
2

По умолчанию ширина сшивателя установлена ​​в самый большой элемент в раскрывающемся списке, но я хочу, чтобы она была той же ширины, что и выбранный элемент.Установите ширину прядильника на текущую ширину элемента

<android.widget.Spinner 
    android:id="@+id/tab_spinner" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:entries="@array/countries" /> 

enter image description here

Как вы можете видеть в правой части изображения, вертушка это слишком долго, из-за длинного элемента в списке.

Как изменить размер выбранного элемента?

ответ

9

По умолчанию Spinner попытается измерить некоторые ваши раскрывающиеся представления и использовать максимальную ширину. Это происходит в Spinner#measureContentWidth(), a protected метод Spinner, вызываемый в Spinner#onMeasure().

Один из способов решения проблемы состоит в том, чтобы убедиться, что ваш метод SpinnerAdapter#getView() всегда использует Spinner#getSelectedItemPosition() для своего аргумента position.

я могу думать о двух возможных решений:

  1. Создание пользовательского блесну с адаптером обертку (я предпочитаю это решение)
  2. Или адаптировать свой собственный адаптер


1 . Создание пользовательского счетчика с адаптером для обертки

Обязательно используйте это в своем макете xml вместо обычного <Spinner>.

Будьте осторожны, чтобы DynamicWidthSpinner#getAdapter() вернул WrapperSpinnerAdapter; используйте его метод getBaseAdapter() для доступа к вашему адаптеру.

public class DynamicWidthSpinner extends Spinner { 

    public DynamicWidthSpinner(Context context) { 
     super(context); 
    } 

    public DynamicWidthSpinner(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public DynamicWidthSpinner(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 


    public void setAdapter(SpinnerAdapter adapter) { 
     super.setAdapter(adapter != null ? new WrapperSpinnerAdapter(adapter) : null); 
    } 


    public final class WrapperSpinnerAdapter implements SpinnerAdapter { 

     private final SpinnerAdapter mBaseAdapter; 


     public WrapperSpinnerAdapter(SpinnerAdapter baseAdapter) { 
      mBaseAdapter = baseAdapter; 
     } 


     public View getView(int position, View convertView, ViewGroup parent) { 
      return mBaseAdapter.getView(getSelectedItemPosition(), convertView, parent); 
     } 

     public final SpinnerAdapter getBaseAdapter() { 
      return mBaseAdapter; 
     } 

     public int getCount() { 
      return mBaseAdapter.getCount(); 
     } 

     public View getDropDownView(int position, View convertView, ViewGroup parent) { 
      return mBaseAdapter.getDropDownView(position, convertView, parent); 
     } 

     public Object getItem(int position) { 
      return mBaseAdapter.getItem(position); 
     } 

     public long getItemId(int position) { 
      return mBaseAdapter.getItemId(position); 
     } 

     public int getItemViewType(int position) { 
      return mBaseAdapter.getItemViewType(position); 
     } 

     public int getViewTypeCount() { 
      return mBaseAdapter.getViewTypeCount(); 
     } 

     public boolean hasStableIds() { 
      return mBaseAdapter.hasStableIds(); 
     } 

     public boolean isEmpty() { 
      return mBaseAdapter.isEmpty(); 
     } 

     public void registerDataSetObserver(DataSetObserver observer) { 
      mBaseAdapter.registerDataSetObserver(observer); 
     } 

     public void unregisterDataSetObserver(DataSetObserver observer) { 
      mBaseAdapter.unregisterDataSetObserver(observer); 
     } 
    } 
} 


2. Адаптация пользовательский адаптер

Будьте осторожны, что parent в getView() не всегда может быть Spinner.

private class SimpleSpinnerAdapter extends BaseAdapter { 

    private LayoutInflater mInflater; 
    private int mResource; 


    public SimpleSpinnerAdapter(Context context, int resource) { 
     mInflater = LayoutInflater.from(context); 
     mResource = resource; 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     return createViewFromResource(
       mInflater, 
       ((Spinner) parent).getSelectedItemPosition(), 
       convertView, 
       parent, 
       mResource); 
    } 

    @Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
     return createViewFromResource(
       mInflater, 
       position, 
       convertView, 
       parent, 
       mResource); 
    } 

    protected View createViewFromResource(LayoutInflater inflater, int position, 
              View convertView, ViewGroup parent, 
              int resource) { 
     View view; 
     if (convertView == null) { 
      view = inflater.inflate(resource, parent, false); 
     } else { 
      view = convertView; 
     } 

     bindView(position, view); 

     return view; 
    } 

    protected void bindView(int position, View view) { 
     // Bind your view. 
    } 

    // getCount(), getItem(), and getItemId() methods. 
} 
+0

первый вариант является наиболее гибким –

-2

Установка SPINNERS XML для:

android:layout_width="wrap_content" 

работал для меня.

+0

Извините забыл опубликовать свой код, но это было уже так, и ничего не изменилось для меня ... –

0
ViewGroup.LayoutParams spinnerLayoutParams = spinner.getLayoutParams(); 
    spinnerLayoutParams.width -= 1; 
    spinner.setLayoutParams(spinnerLayoutParams); 

ли это по пункту выбран

+1

Значение «-1» - MATCH_PARENT. Почему это поможет? –

Смежные вопросы