3

リストナビゲーション付きのActionBarがあります。ご覧のとおり、ActionBar.OnNavigationListener は新しく選択された位置に対してのみ呼び出されます。既に選択されているアイテムを選択した場合でも、すべての選択に対してコールバックを行う方法はありますか?

4

1 に答える 1

2

私はこれに対するハックな解決策しか持っておらず、それを改善する方法について提案を受け付けています。しかし、それは機能します。

秘訣は、実際の選択後に選択される非表示のアイテムを用意することです。このようにonNavigationItemSelectedして、選択したアイテムを再選択すると再度呼び出されます。

public class ReselectAdapter extends ArrayAdapter<String> {
    private Context mContext;
    private ArrayList<String> mItems;
    private int mInternalPosition;

    public ReselectAdapter(Context context, ArrayList<String> items) {
        super(context, R.layout.sherlock_spinner_item, items);
        mContext = context;
        mItems = items;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView textView = (TextView) convertView;
        if (textView == null) {
            textView = (TextView) LayoutInflater.from(mContext).inflate(
                    R.layout.sherlock_spinner_item, null);
            textView.setText(mItems.get(mInternalPosition));
        }
        return textView;
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup
            parent) {
        TextView textView = null;
        if (position == mItems.size() - 1) {
            textView = new TextView(mContext);
            textView.setHeight(0);
        } else {
            textView = (TextView) LayoutInflater.from(mContext)
                    .inflate(R.layout.sherlock_spinner_dropdown_item, 
                            parent, false);
            textView.setText(mItems.get(position));
        }
        parent.setVerticalScrollBarEnabled(false);
        return textView;
    }

    public void setInternalPosition(int internalPosition) {
        mInternalPosition = internalPosition;
    }
}


@Override
public void onCreate(Bundle savedInstanceState) {
    // [...]
    ArrayList<String> items = new ArrayList<String>();
    items.add("A");
    items.add("B");
    items.add("C");
    items.add(""); // the last item is the invisible one
    mReselectAdapter = new ReselectAdapter(context, items);
    getSupportActionBar().setListNavigationCallbacks(mReselectAdapter, this);
}


@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
    int navigationItemCount = getSupportActionBar().getNavigationItemCount();
    if (itemPosition == navigationItemCount - 1) {
        return true;
    }
    Log.i("onNavigationItemSelected", mReselectAdapter.getItem(itemPosition));
    mReselectAdapter.setInternalPosition(itemPosition);
    getSupportActionBar().setSelectedNavigationItem(navigationItemCount - 1);
    return true;
}
于 2013-03-13T01:20:05.830 に答える