8

Android アクションバー スピナーを Google Currents アプリケーションのようなものにカスタマイズしようとしています。基本的に、「タイトル」は同じままで、「サブタイトル」のみがスピナーから選択したものを反映する必要があります。カスタム スピナーを作成する必要があり、 getView()andgetDropDownView()メソッドをオーバーライドする必要があることを理解しています。しかし、これらのメソッドを適切にオーバーライドする方法について、ここで非常に混乱しています。正しい方向に私を微調整してください。私の質問が明確になったことを願っています。

画像のスクリーンショット
(ソース: androidcowboy.com )

以下は私のコードです。

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;

}
}
4

2 に答える 2

17

私はそれを解決しました。

私のアダプタークラスのリスト:

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;
}

}

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>

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>
于 2013-03-08T11:57:18.447 に答える
2

最初の回答は役に立ちますが、Adapter サブクラスは不要です。

@ user1624587 の回答のように XML を定義し、次のように参照しpublic boolean onCreateOptionsMenu(Menu menu)ます。

    ArrayAdapter<CharSequence> someAdapter = new
        ArrayAdapter<CharSequence>(context, R.layout.ab_main_view, 
        android.R.id.text1, getResources().getStringArray(R.array.some_array));


    someAdapter.setDropDownViewResource(R.layout.ab_dropdown);

    MenuItem item = menu.add("SomeTitle").setActionView(R.layout.some_spinner);
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); //or whatever

    someSpinner = (someSpinner) item.getActionView();
    someSpinner.setAdapter(someAdapter);
    ...etc
于 2013-06-27T02:38:44.177 に答える