Android Spinner具有"下拉状态"和"关闭状态"的不同布局?

dbm*_*dbm 62 android spinner android-spinner

我的布局中有一个Android Spinner视图.我希望该微调器在关闭时只显示一个文本项,但是当用户点击它时(即打开微调器对话框)我想为每个项显示更多信息,包括图标和其他描述文本视图.现在,微调器在两种状态下都显示了相同的布局(图标,标题+描述).

如果我将一个ArrayAdapter附加到微调器,那么我可以访问一个名为"setDropDownViewResource"的东西,但这不一定是我需要的东西,因为我的微调器数据是从一个Cursor中提取的,而不是从任何类型的数组中取出的(我现在有, ,创建了我自己的适配器,扩展了BaseAdapter).

谁可以帮助我?

Flo*_*Flo 106

您必须Adapter为Spinner 创建一个自定义类,并覆盖getView()常规关闭视图和getDropDownView()下拉列表视图的两个方法.两种方法都必须View为单个元素返回一个对象.

看看本教程,它可能会帮助您入门.


小智 14

我也有问题.我没有重写这个课程,而是采用了一种更简单的方法.

但首先,您需要了解适配器构造函数中的资源ID与中的另一个中的资源ID之间的区别setDropDownViewResource(...).例如,

SimpleAdapter adapter =
    new SimpleAdapter(ab.getThemedContext(), data, R.layout.actionbar_dropdown, new String[] { "EventID", "Icon" },
        new int[] { R.id.event_id, R.id.icon });

adapter.setDropDownViewResource(R.layout.actionbar_list_item);
Run Code Online (Sandbox Code Playgroud)

R.layout.actionbar_dropdown微调器的样式,也是R.layout.actionbar_list_item每个列表项的样式.

我在这里使用SimpleAdapter,因为如果我使用ArrayAdapter,xml只能是一个TextView.

R.layout.actionbar_list_item包含一个ID为的TextView event_id和一个id为的ImageView icon.

R.layout.actionbar_dropdown几乎完全相同actionbar_list_item,但后者的ImageView的可见性设置为GONE.

这样,每个列表项都有一个textview和一个imageview,但是你只能在微调器上看到一个textview.


Alv*_*ban 10

使用Flo链接的教程代码,我创建了以下CustomSpinnerAdapter,以显示两个不同的字符串集,一个显示项目,另一个不显示.我希望它对某人有帮助.

public class CustomSpinnerAdapter extends ArrayAdapter<String> {

Context mContext;
int mTextViewResourceId;
String[] mObjects;
String[] mShortNameObjects;

public CustomSpinnerAdapter(Context context, int textViewResourceId,
                            String[] objects, String[] shortNameObjects) {
    super(context, textViewResourceId, objects);
    mContext = context;
    mTextViewResourceId = textViewResourceId;
    mObjects = objects;
    mShortNameObjects = shortNameObjects;
}

@Override
public View getDropDownView(int position, View convertView,
                            ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    TextView row = (TextView) inflater.inflate(mTextViewResourceId, parent, false);
    row.setText(mObjects[position]);

    return row;
}

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

public View getCustomView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    TextView row = (TextView) inflater.inflate(mTextViewResourceId, parent, false);
    row.setText(mShortNameObjects[position]);

    return row;
}
}
Run Code Online (Sandbox Code Playgroud)

片段内的用法:

CustomSpinnerAdapter mSpinnerAdapter = new CustomSpinnerAdapter(getActivity(), R.layout.spinner_item, getResources().getStringArray(R.array.action_filter), getResources().getStringArray(R.array.action_filter_short_names));
Run Code Online (Sandbox Code Playgroud)

最后,微调项目的布局:

spinner_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="18dip"
    android:gravity="left"
    android:textColor="@color/navdraw_list_item_background_default"
    android:padding="5dip" />
Run Code Online (Sandbox Code Playgroud)


Joa*_*olo 8

仅使用替代布局设置下拉视图资源:

ArrayAdapter<String> genderAdapter = new ArrayAdapter<>(this, R.layout.adapter_spinner_white, Constants.GENDER);
genderAdapter.setDropDownViewResource(R.layout.adapter_spinner_white_dropdown);
view.setAdapter(genderAdapter);
Run Code Online (Sandbox Code Playgroud)

对我来说,它只是一个带有额外填充的布局,因为我的旋转器背景是圆形可绘制的并且需要这个额外的空间.