可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have an Android Spinner view in my layout. I would like that spinner to show only a single text item when closed, but when the user clicks on it (i.e. opens the spinner dialog) I would like to show more extensive information for each item, including an icon and an additional description text view. As it is now the spinner shows the very same layout (icon, title + description) in both states.
If I attach an ArrayAdapter to the spinner, then I get access to something called "setDropDownViewResource" but that's not necessarily what I need, since my spinner data is fetched from a Cursor not from an Array of any kind (I have, as of now, created my own adapter, extending BaseAdapter).
Anyone who can help me?
回答1:
You have to create a custom Adapter
class for the Spinner and overwrite the two methods getView()
for the normal closed view and getDropDownView()
for the drop down list view. Both methods must return a View
object for a single element.
Have a look at this tutorial it might help you getting started.
回答2:
I was having problem too. Rather than overriding the class, I hava an easier way to do this.
But first you need to understand the difference between the resource id in the adapter constructor, and the other one in setDropDownViewResource(...)
. For example,
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
is the style for spinner, and R.layout.actionbar_list_item
for every single list item.
I used SimpleAdapter here, since if I use ArrayAdapter, the xml can only be a single TextView.
R.layout.actionbar_list_item
contains a TextView whose id is event_id
and an ImageView whose id is icon
.
R.layout.actionbar_dropdown
is almost exactly the same as actionbar_list_item
, but the visibility of ImageView of the latter is set to GONE.
In this way every list item has a textview and an imageview, but you will only see a textview on the spinner.
回答3:
Using the code of the tutorial linked by Flo, I created the following CustomSpinnerAdapter in order to show two different sets of strings, one when the items are displayed, and one when not. I hope it helps someone.
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;
}
}
And the usage inside a Fragment:
CustomSpinnerAdapter mSpinnerAdapter = new CustomSpinnerAdapter(getActivity(), R.layout.spinner_item, getResources().getStringArray(R.array.action_filter), getResources().getStringArray(R.array.action_filter_short_names));
Finally, the layout for the spinner item:
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" />
回答4:
Only sets the dropdown view resource with your alternative layout:
ArrayAdapter<String> genderAdapter = new ArrayAdapter<>(this, R.layout.adapter_spinner_white, Constants.GENDER);
genderAdapter.setDropDownViewResource(R.layout.adapter_spinner_white_dropdown);
view.setAdapter(genderAdapter);
For me, it's only a layout with an extra padding left, because my background of spinner is a rounded drawable and require this extra space.
回答5:
Just call setUpSpinner() method after getting reference to spinner
// here is setUpSpinner method
private void setupSpinner() {
// Create adapter for spinner. The list options are from the String array it will use
// the spinner will use the default layout
ArrayAdapter spinnerAdapter = ArrayAdapter.createFromResource(this,
R.array.array_dropdown_options, android.R.layout.simple_spinner_item);
// Specify dropdown layout style - simple list view with 1 item per line
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
// Apply the adapter to the spinner
spinner.setAdapter(spinnerAdapter);
// spinner is referenced spinner by finViewById.
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String selection = (String) parent.getItemAtPosition(position);
if (!TextUtils.isEmpty(selection)) {
if (selection.equals(getString(R.string.item_a))) {
// your code for selected item whose id equals to id to R.string.item_a
} else if (selection.equals(getString(R.string.item_b))) {
// your code
} else {
// your code
}
}
}
// Because AdapterView is an abstract class, onNothingSelected must be defined
@Override
public void onNothingSelected(AdapterView<?> parent) {
// code for nothing selected in dropdown
}
});
}