在对话框模式下覆盖 Spinner 的下拉列表样式

Posted

技术标签:

【中文标题】在对话框模式下覆盖 Spinner 的下拉列表样式【英文标题】:Overriding dropdown list style for Spinner in Dialog mode 【发布时间】:2013-02-02 09:21:32 【问题描述】:

当 Spinner id 处于对话模式 (android:spinnerMode="dialog") 时,我需要覆盖下拉微调器项目列表。我需要这个来定义我自己的列表分隔符。

我在应用程序主题中找到了 dropDownListViewStyle 项,其中包含分隔项。它有效,但仅适用于 android:spinnerMode="dropdown"。

“对话”模式能有同样的效果吗?

【问题讨论】:

【参考方案1】:

试试这个:

<Spinner
    android:id="@+id/spinnerAddToList"
    android:layout_
    android:layout_
    android:layout_marginTop="10dp"
    android:theme="@style/ThemeOverlay.AppCompat.Light"
    android:spinnerMode="dialog"/>

下拉布局 spinner_item_line_drop.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:paddingLeft="3dp"
    android:paddingRight="3dp">

    <TextView
        android:id="@+id/text_view"
        android:layout_
        android:layout_
        android:gravity="center_vertical"
        android:textSize="18sp" />

    <LinearLayout
        android:id="@+id/separator"
        android:layout_
        android:layout_
        android:background="@color/colorPrimary"
        android:orientation="vertical"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"/>

</LinearLayout>

主视图布局:spinner_item_line_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:paddingBottom="10dp"
    android:paddingLeft="3dp"
    android:paddingRight="3dp"
    android:paddingTop="10dp">

    <TextView
        android:id="@+id/text_view"
        android:layout_
        android:layout_
        android:gravity="center_vertical"
        android:textSize="18sp" />

</LinearLayout>

微调适配器:

public class SpinnerLineAdapter extends BaseAdapter 

    private List<MyListEntity> values;

    public SpinnerLineAdapter(List<MyListEntity> values)
    
        this.values = values;
    

    public void setValue(List<MyListEntity> list)
    
        this.values = list;
    

    @Override
    public int getCount() 
        return values.size();
    

    @Override
    public MyListEntity getItem(int position) 
        return values.get(position);
    

    @Override
    public long getItemId(int position) 
        return position;
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        View itemView = convertView;
        ViewHolder viewHolder;

        Context context = parent.getContext();

        if (convertView == null) 
            itemView = LayoutInflater.from(context).inflate(R.layout.spinner_item_line_main, parent, false);

            viewHolder = new ViewHolder();
            viewHolder.textView = itemView.findViewById(R.id.text_view);

            itemView.setTag(viewHolder);

         else 
            viewHolder = (ViewHolder) itemView.getTag();
        

        viewHolder.textView.setText(values.get(position).getName());

        return itemView;
    

    public View getDropDownView(int position, View convertView,ViewGroup parent) 
        View itemView = convertView;
        ViewHolder viewHolder;

        Context context = parent.getContext();

        if (convertView == null) 
            itemView = LayoutInflater.from(context).inflate(R.layout.spinner_item_line_drop, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.textView = itemView.findViewById(R.id.text_view);
            itemView.setTag(viewHolder);
         else 
            viewHolder = (ViewHolder) itemView.getTag();
        

        viewHolder.textView.setText(values.get(position).getName());

        return itemView;
    

    private static class ViewHolder 
        TextView textView;
    

活动:

SpinnerLineAdapter spinnerAddToListAdapter = new SpinnerLineAdapter(list);
                spinnerAddToList.setAdapter(spinnerAddToListAdapter);
                spinnerAddToList.setSelection(0, false);
                spinnerAddToList.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
                    @Override
                    public void onItemSelected(AdapterView<?> adapterView, View view,
                                               int position, long id) 

                        MyListEntity list = spinnerAddToListAdapter.getItem(position);
                        viewModel.addList(list.id);
                        viewModel.update(myEntity);
                    

                    @Override
                    public void onNothingSelected(AdapterView<?> adapter) 
                    
                );

按钮点击显示对话框:

    mButtonAdd.setOnClickListener(view -> 
        spinnerAddToList.performClick();
    );

【讨论】:

以上是关于在对话框模式下覆盖 Spinner 的下拉列表样式的主要内容,如果未能解决你的问题,请参考以下文章

下拉列表框Spinner-采用自定义布局文件作为Spinner样式

Android 下拉列表Spinner

android 中如何设置Spinner点击后弹出的下拉列表的宽度样式

如何修改spinner控件的样式

Android Studio App开发中高级控件下拉列表Spinner的讲解及实战(附源码 超详细必看)

如何在 Android 中自定义 Spinner