Android的微调不同布局的“下拉状态”和“closures状态”?
我的布局中有一个Android微调视图。 我希望微调器在closures时只显示一个文本项目,但是当用户点击它时(即打开微调器对话框),我想显示每个项目的更多信息,包括图标和附加描述文本视图。 因为它现在是微调在两种状态显示相同的布局(图标,标题+描述)。
如果我将一个ArrayAdapter附加到微调,那么我可以访问一个名为“setDropDownViewResource”的东西,但这不一定是我所需要的,因为我的微调数据是从一个光标而不是从任何types的数组中获取的(截至目前,创build了我自己的适配器,扩展了BaseAdapter)。
任何人都可以帮助我?
您必须为Spinner创build一个自定义Adapter
类,并覆盖正常closures视图和getDropDownView()
两个方法的getView()
方法。 这两个方法都必须为单个元素返回一个View
对象。
看看这个教程,它可能会帮助你入门。
我也有问题。 而不是压倒class级,我有一个更简单的方法来做到这一点。
但首先您需要了解适配器构造函数中的资源ID和setDropDownViewResource中的另一个资源ID之间的区别。 例如,
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);
R.layout.actionbar_dropdown是spinner的风格,而R.layout.actionbar_list_item是每一个列表项目。 我在这里使用SimpleAdapter,因为如果我使用ArrayAdapter,xml只能是单个TextView。 R.layout.actionbar_list_item包含一个TextView,它的id是event_id,ImageView的id是图标。 R.layout.actionbar_dropdown与actionbar_list_item几乎完全相同。 但后者的ImageView的可见性被设置为GONE。
通过这种方式,每个列表项都有一个textview和一个imageview,但是你只能在微调器上看到一个textview。
使用由Flo链接的教程的代码,我创build了以下CustomSpinnerAdapter以显示两个不同的string集,一个是显示项目时,另一个是不显示的。 我希望它可以帮助别人。
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; } }
和片段内的用法:
CustomSpinnerAdapter mSpinnerAdapter = new CustomSpinnerAdapter(getActivity(), R.layout.spinner_item, getResources().getStringArray(R.array.action_filter), getResources().getStringArray(R.array.action_filter_short_names));
最后,微调项目的布局:
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" />
只能使用替代布局设置下拉视图资源:
ArrayAdapter<String> genderAdapter = new ArrayAdapter<>(this, R.layout.adapter_spinner_white, Constants.GENDER); genderAdapter.setDropDownViewResource(R.layout.adapter_spinner_white_dropdown); view.setAdapter(genderAdapter);
对我来说,这只是一个额外的填充左边的布局,因为我的微调背景是一个圆形的drawable,需要这个额外的空间。