Action Bar Sherlock NAVIGATION_MODE_LIST - dropdownListPreferredItemHeight ignored

actionbarsherlock, android, android-actionbar

Solution

You don't pass the `parent` to the `inflate()` method. That should be the reason why the height is ignored.

layoutInflater.inflate(R.layout.sherlock_spinner_dropdown_item, parent, false);

instead of

layoutInflater.inflate(R.layout.sherlock_spinner_dropdown_item, null);

Implement `getView()` and `getDropDownView()` like this:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = layoutInflater.inflate(
                R.layout.sherlock_spinner_item, parent, false);
    }
    ((TextView) convertView.findViewById(android.R.id.text1))
             .setText(getItem(position));
    return convertView;
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = layoutInflater.inflate(
                R.layout.sherlock_spinner_dropdown_item, parent, false);
    }
    ((TextView) convertView.findViewById(android.R.id.text1))
             .setText(getItem(position));
    return convertView;
}

Problem

I am using the Action Bar Sherlock with navigation mode NAVIGATION_MODE_LIST with a custom spinner adapter. The problem is that the drop down list view looks squeezed, the items' height appear like having wrap_content instead of a fixed height in dip. (this is how it looks) According to the *abs_themes*, the height should be 48dip: ``` <item name="dropdownListPreferredItemHeight">48dp</item> ``` If I use a non-custom spinner adapter created from resources it works properly, what am I missing? Here a sample code I wrote: MainActivity.java ``` package com.example.themetest; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.SpinnerAdapter; import android.widget.TextView; import android.widget.Toast; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.ActionBar.OnNavigationListener; import com.actionbarsherlock.app.SherlockActivity; public class MainActivity extends SherlockActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayUseLogoEnabled(true); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); final String[] choices = {"Android", "iOS", "RIM"}; CustomSpinnerAdapter customSpinnerAdapter = new CustomSpinnerAdapter(MainActivity.this, android.R.id.text1, choices); actionBar.setListNavigationCallbacks(customSpinnerAdapter, new OnNavigationListener() { @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) { Toast.makeText(MainActivity.this, choices[itemPosition], Toast.LENGTH_SHORT).show(); return false; } }); // this works properly // actionBar.setListNavigationCallbacks(ArrayAdapter.createFromResource(this, R.array.sections, R.layout.sherlock_spinner_dropdown_item), // new OnNavigationListener() { // public boolean onNavigationItemSelected(int itemPosition, long itemId) { // return false; // } // }); } private class CustomSpinnerAdapter extends ArrayAdapter<String> implements SpinnerAdapter { private LayoutInflater layoutInflater; public CustomSpinnerAdapter(Context context, int textViewResourceId, String[] values) { super(context, textViewResourceId, values); this.layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { return initView(position, convertView); } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { return initView(position, convertView); } private View initView(int position, View convertView) { if (convertView == null) { convertView = layoutInflater.inflate(R.layout.sherlock_spinner_dropdown_item, null); } ((TextView) convertView.findViewById(android.R.id.text1)).setText(getItem(position)); return convertView; } } } ``` styles.xml ``` <resources> <style name="Theme.AppTheme" parent="Theme.Sherlock.Light" /> </resources> ``` manifest.xml ``` <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.AppTheme" > <activity android:name="com.example.themetest.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> ```

Original source