korro
korro

Reputation: 507

ActionBarSherlock and ActionBar.OnNavigationListener

I have ActionBar with list navigation. As I can see, ActionBar.OnNavigationListener is called only for newly selected positions. Is there a way to have callback for every selection, even if I select already selected item?

Upvotes: 3

Views: 787

Answers (1)

Matthias Robbers
Matthias Robbers

Reputation: 15728

I only have a hacky solution to this and I am open for suggestions how to improve it. But it works.

The trick is to have an invisible item that gets selected after the actual selection. This way, onNavigationItemSelected gets called again when you reselect the selected item.

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

Upvotes: 2

Related Questions