Search code examples
androiddrop-down-menuandroid-actionbarspinnercustomization

Actionbar spinner customisation


I am trying to customise the android actionbar spinner to something that like the google currents application. Basically, only the 'subtitle' should reflect what i choose from the spinner while the 'title' remains the same. I understand that a custom spinner needs to be created and I have to override the getView() and getDropDownView() method. But I am very confused here on how to override these methods properly. Can some please nudge me in the right direction. I hope I made my question clear.

the image screenshot
(source: androidcowboy.com)

Given below is my code.

public class CustomSpinnerAdapter extends BaseAdapter {

private LayoutInflater inflater;

private final Context context;
private final String[] dropDown;
private final String mainText;
private final String subText;

public CustomSpinnerAdapter(Context context, 
        String mainText, String subText,String[] dropDown) {

    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    this.mainText=mainText;
    this.subText=subText;
    this.context = context;
    this.dropDown=dropDown;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}




@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    View actionBarView = inflater.inflate(R.layout.custom_spinner, null);
    TextView textView = (TextView) actionBarView
            .findViewById(R.id.custom_spinner_textview);
    textView.setText(mainText);
    return actionBarView;
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {

    View dropDownView = inflater.inflate(R.layout.custom_spinner, null);
    TextView dropDownTextView = (TextView) dropDownView
            .findViewById(R.id.custom_spinner_dropdown_textview);

    dropDownTextView.setText(dropDown[position]);
    return dropDownView;

}
}

Solution

  • I solved it.

    Listing of my adapter class:

    public class AdapterBaseMaps extends BaseAdapter {
    
    Context context;
    int layoutResourceId;
    ArrayList<ObjectLayers> data;
    LayoutInflater inflater;
    
    public AdapterBaseMaps(Context context, int textViewResourceId,
            ArrayList<ObjectLayers> data) {
        // super(a, textViewResourceId, data);
        this.data = data;
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.context = context;
        this.layoutResourceId = textViewResourceId;
    
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    
        View actionBarView = inflater.inflate(R.layout.ab_main_view, null);
        TextView title = (TextView) actionBarView
                .findViewById(R.id.ab_basemaps_title);
        TextView subtitle = (TextView) actionBarView
                .findViewById(R.id.ab_basemaps_subtitle);
        title.setText(context.getResources()
                .getString(R.string.label_cartravel));
        subtitle.setText(data.get(position).getLayerName());
        return actionBarView;
    
    }
    
    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        View actionBarDropDownView = inflater.inflate(
                R.layout.ab_dropdown_view, null);
        TextView dropDownTitle = (TextView) actionBarDropDownView
                .findViewById(R.id.ab_basemaps_dropdown_title);
    
        dropDownTitle.setText(data.get(position).getLayerName());
    
        return actionBarDropDownView;
    
    }
    
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return data.size();
    }
    
    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }
    
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
    
    }
    

    Listing of ab_main_view.xml:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
    
    <TextView
        android:id="@+id/ab_basemaps_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="20sp"
        android:textColor="@color/White" />
    
    <TextView
        android:id="@+id/ab_basemaps_subtitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/ab_basemaps_title"
        android:text="TextView"
        android:textColor="@color/White"
        android:textSize="13sp" />
    
    </RelativeLayout>
    

    Listing of ab_dropdown_view.xml:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
    
    <TextView
        android:id="@+id/ab_basemaps_dropdown_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textSize="20sp"
        android:padding="5dp"
        android:textColor="@color/White" />
    
    </RelativeLayout>