完全自定义Spinner的外观

时间:2015-10-30 17:30:49

标签: android widget

我想自定义折叠的微调器外观和下拉菜单的外观。代码方面,这就是我正在做的事情:

        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.country_arrays,
R.layout.ssi);
                //android.R.layout.simple_spinner_item);

        adapter.setDropDownViewResource(R.layout.ssi2);
        final Spinner states = (Spinner) findViewById(R.id.spinner);
        states.setAdapter(adapter);

现在问题是,ssissi2布局必须有TextView作为 root ,即:

ssi.xml:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1"

    android:singleLine="true"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:ellipsize="marquee" 
    android:textColor="#00ff00"
    android:background="#000020"    
    />

ssi2.xml:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1"

    android:singleLine="true"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:ellipsize="marquee" 
    android:textSize="10pt"
    android:textColor="#0000ff"
    android:background="#800000"/>

这有效地阻止了对微调器项目执行任何类型的自定义/布局。我想要的是能够为微调器的折叠外观嵌入类似于自定义LinearLayout的内容,并为展开的下拉列表添加一个截然不同的布局 - 例如带有图像的FrameLayout和文本。即:

 <LinearLayout>
     <ImageView>...
     <TextView>....
     <LinearLayout> .... </LinearLayout>
 </LinearLayout>

EDIT1 :有了Aleksey的答案,我几乎就在那里......除了,如何删除内置指示灯(见图)?

Default style for collapsed spinner

EDIT2 :我最终将visibility微调器设置为gone,然后有一个自定义小部件(比如ImageView)转发{{1 } {}事件到onClick。丑陋,但有效。

Spinner

1 个答案:

答案 0 :(得分:0)

使用您自己的ArrayAdapter。覆盖 getDropDownView getCustomDropDownView ,例如:

class CustomAdapter extends ArrayAdapter<String> {
    public CustomAdapter(Context context, int itemLayoutResourceId, arrayList) {
        super(context, itemLayoutResourceId, arrayList);
    }

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

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

    private View getCustomDropDownView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(context);
            convertView = inflater.inflate(R.layout.spinner_item_dropdown, parent, false);
        }

        TextView label = (TextView) convertView.findViewById(R.id.textView);
        label.setText(arrayList[position]);

        return convertView;
    }

    public View getCustomView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.spinner_item, parent, false);
        }

        TextView label = (TextView) convertView.findViewById(R.id.text2);
        label.setText(arraylist[position]);

        return convertView;
    }
}

并设置自己的项目布局。多数民众赞成。