2013-03-09 4 views
3

У меня есть ActionBar со списком навигации. Как я вижу, ActionBar.OnNavigationListener вызывается только для вновь выбранных позиций. Есть ли способ иметь обратный вызов для каждого выбора, даже если я выбираю уже выбранный элемент?ActionBarSherlock и ActionBar.OnNavigationListener

+0

используется вкладка навигации в ActionBar ли? Если это так, используйте интерфейс 'TabListener' и метод' onTabReselected() '. – saschoar

ответ

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

спасибо за ответ, просто интересно, нашли ли вы лучший способ? – myanimal

+0

Нет, это все равно, как я бы это реализовал в данный момент. –

Смежные вопросы