2

gmail Android アプリケーションのように NAVIGATION_MODE_LIST を達成しようとしています。私の主な問題は、現在選択されているアイテムをスピナー リストから非表示にすることです。たとえば、ここに示すように、gmail アンドロイド アプリ[送信済み] を選択すると、スピナーに他の要素のみが表示されます。

私の理解では、カスタムアダプターで NAVIGATION_MODE_LIST を使用するのではなく、カスタム ActionView であると言っています。

4

2 に答える 2

2

他の誰かがこの問題の解決策を探している場合は、ここにあります。

これは、リンクの助けを借りて書かれたサンプルコードです

次のコードを使用してアダプターを作成し、それを ActionBar List Navigation に結合します

ActionBar actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

    itemArr = getResources().getStringArray(R.array.array_spinner_items);
    items = toArrayList(itemArr, null);

    navigationAdapter = new CustomAdapter(this, R.layout.navigation_item_layout, items);
    actionBar.setListNavigationCallbacks(navigationAdapter, this);
    actionBar.setDisplayShowTitleEnabled(false);

拡張BaseAdapterまたはArrayAdapterおよびimplement SpinnerAdapter

アダプターで、ドロップダウンの個々のアイテムビューを担当するgetDropdownViewをオーバーライドし、ActionBarに表示されるビューを担当するgetViewをオーバーライドします

`public class CustomAdapter extends ArrayAdapter implements SpinnerAdapter {

    Context context;
    int textViewResourceId;
    ArrayList<String> arrayList;

    public CustomAdapter(Context context, int textViewResourceId,  ArrayList<String> arrayList) {
        super(context, textViewResourceId, arrayList);

        this.context = context;
        this.textViewResourceId = textViewResourceId;
        this.arrayList = arrayList;

    }

    @Override
     public View getDropDownView(int position, View convertView, ViewGroup parent){
       if (convertView == null)
       {
         LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         //convertView = vi.inflate(android.R.layout.simple_spinner_dropdown_item, null);
         convertView = vi.inflate(R.layout.navigation_item_layout, null);
       }

       TextView textView = (TextView) convertView.findViewById(R.id.navigation_item);
       textView.setText(arrayList.get(position).toString());//after changing from ArrayList<String> to ArrayList<Object>

       if (position  == curitem) { 
          textView.setHeight(0);
      }
      else{
        textView.setHeight(60);
      }

       return convertView;
     }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView == null) {
            convertView = getLayoutInflater().inflate(R.layout.navigation_item_layout, null);
        }
        TextView textview = (TextView) convertView.findViewById(R.id.navigation_item);
        textview.setText(itemArr[position].toUpperCase());
        textview.setTextColor(Color.RED);
        return convertView;
    }

}`

スピナー項目 navigation_tem_layout.xml のレイアウト ファイルは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<TextView  xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/navigation_item" 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:padding="10dp" />
于 2012-12-10T22:18:19.683 に答える
1

ナビゲーション リストに現在のエントリを提供せずに、getView() メソッドのカスタム SpinnerAdapter に表示するだけでよい場合があります。

完全なソース コードで投稿を書いたばかりですが、私の例では静的な型付き配列を使用しています。これを変更して、カスタム NavigationListItem クラス (または呼び出したいもの) を使用し、アクティビティごとに動的リストを作成して、そうしないようにすることができます。現在のものを含みます。スピナーは開始時に最初のエントリを選択しようとするので注意が必要ですが、位置によって提供されるエントリを使用するのではなく、getView() で必要なものを表示できます。

dandar3.blogspot.com/2013/03/actionbarsherlock-custom-list-navigation.html

于 2013-03-24T18:20:21.477 に答える