Поведение Spinner не ожидается для наших требований. Мое решение не работает со Spinners, сделайте его аналогичным образом, с одним ListView внутри одного BaseFragment для исследования ожидаемой нами функциональности.
Преимущества:
- Больше нет головных болей, расширяющих значения по умолчанию для Spinner.
- Простота реализации и настройки.
- Полная совместимость со всеми API Android.
- Нет лица против первого вызова OnItemSelectedListener.onItemSelected.
Основная идея, сделать что-то вроде этого:
Макет BaseFragment может выглядеть примерно так:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@null"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<ListView
android:id="@+id/fragment_spinnerList"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Код выглядит примерно так:
public class SpinnerListFragment extends android.support.v4.app.DialogFragment {
static SpinnerListFragment newInstance(List<String> items) {
SpinnerListFragment spinnerListFragment = new SpinnerListFragment();
Bundle args = new Bundle();
args.putCharSequenceArrayList("items", (ArrayList) items);
spinnerListFragment.setArguments(args);
return spinnerListFragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new Dialog(getActivity(), R.style.dialog);
final View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_spinner_list, null);
dialog.getWindow().setContentView(view);
dialog.setCanceledOnTouchOutside(true);
// CUSTOMIZATION...
final List items = (ArrayList) getArguments().getCharSequenceArrayList("items");
final ListView spinnerList = (ListView) view.findViewById(R.id.fragment_spinnerList);
ArrayAdapter<String> arrayAdapter =
new ArrayAdapter<String>(
getActivity(),
R.layout.search_spinner_list_item,
items);
spinnerList.setAdapter(arrayAdapter);
spinnerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// DO SOMETHING...
SpinnerListFragment.this.dismiss();
}
});
return dialog;
}
}