Reputation: 507
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
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