Top/Bottom 微调器的填充

Top/Bottom Padding for Spinner

如何为 Android 中的微调器指定 first/last 项的 top/bottom 上的额外填充?请参阅下面的 Goolge 示例(8 dp 间距)。

您需要使用自定义布局为您 Spinner 创建一个自定义适配器。因此,您只需要提供具有适当 margin/paddins.

的布局
Spinner spinner = (Spinner) findViewById(R.id.myspinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.data, R.layout.spinner_item);
adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
spinner.setAdapter(adapter);

你可以找到一个有效的例子here

只需为要在微调器中显示的项目创建一个单独的布局。

像这样

spinner_text_view.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/customTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="15dp"
android:text="@string/sample_list_item"
android:textColor="@android:color/black"
android:textSize="20sp" />

然后在您的 activity/fragment 中,您可以创建一个适配器(在本例中是一个简单的数组适配器)并将此布局传递给该适配器引用。最后将该适配器设置为微调器,您可以获得所需的结果。

示例代码。

private void setupSpinner() {
    String[] sampleSpinnerItems = {"One", "Two", "Three", "Four", "Five"};
    ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
            R.layout.spinner_text_view, sampleSpinnerItems);
    sampleSpinner.setAdapter(spinnerAdapter);
}    

希望对您有所帮助。

注意:spinner_text_view是您之前创建的布局文件。

您需要为此自定义适配器和自定义布局。 您可以使用 2 种布局。假设您有 n 个元素要显示,在您的微调器中您将有 n+2 个。如果位置为 0(第一个元素)或最后一个元素,您将显示空布局,否则您将显示其他布局。 您将用于创建此 space

的空布局

微调器不支持多种视图类型。Issue

我建议您使用对话框来显示您的列表。

已编辑

根据您的评论解决了您的问题question

您可以使用 Spinner 的自定义 Adapter 来完成此操作。它看起来像这样:

class YourAdapter extends BaseArrayAdapter<YourObject> {

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.your_item, parent, false);
            DropDownViewHolder holder = new DropDownViewHolder();
            holder.root = convertView.findViewById(R.id.drop_down_root);
            // other assignments etc.
            convertView.setTag(holder);
        }
        DropDownViewHolder holder = (DropDownViewHolder) convertView.getTag();
        int bottomPadding = 0;
        int topPadding = 0;
        if (position == 0) {
            topPadding = getContext().getResources().getDimensionPixelSize(R.dimen.margin_8);
        } else if (position == (getCount() - 1)) {
            bottomPadding = getContext().getResources().getDimensionPixelSize(R.dimen.margin_8);
        }

        holder.root.setPadding(0, topPadding, 0, bottomPadding);
        // other UI related logic etc.
        return convertView;
    }

    // ...

    public static class DropDownViewHolder {
        View root;
        // other views
    }
}

实际上,可以将设置额外填充的逻辑更改为将某些存根视图的可见性更改为 VISIBLE 或根据位置增加一些其他布局,但使用填充的解决方案对我来说似乎更自然。

您实际上不需要自定义适配器。以下解决方案完美运行。

创建可绘制对象bg_spinner.xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="3dp" />
    <padding
        android:bottom="8dp"
        android:top="8dp" />
    <solid android:color="yourPopupColor" />
</shape>

然后为 XML 中的 Spinner 设置 android:popupBackground="@drawable/bg_spinner_popup" 属性。

这就像一个魅力,没有任何被切断等。