2012-02-16 2 views
0

Чтобы улучшить удобство использования для слепых пользователей, мне нужен ListActivity с помощью метода OnItemSelected для добавления таких вещей, как вибрация или звуки, когда выбран конкретный список. Поэтому я расширил класс ListActivity и добавлены следующие методы:ListActivity с выбираемыми позициями

protected void onListItemSelected(ListView parent, View v, int position, long id) { 
} 

private AdapterView.OnItemSelectedListener mOnSelectedListener = new AdapterView.OnItemSelectedListener() { 

    public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { 
     onListItemSelected((ListView)parent, v, position, id);   
    } 

    public void onNothingSelected(AdapterView<?> parent) { 
     // TODO Auto-generated method stub   
    } 
}; 

Теперь, когда я создаю экземпляр моего нового класса SelectableListActivity и переопределить onListItemSelected метод, до сих пор ничего не происходит. Есть идеи? Спасибо заранее!

+0

Очень часто проблема с новыми разработчиками Android заключается в том, чтобы полагаться на ListView.getSelectedItemPosition(). В сенсорном режиме этот метод вернет INVALID_POSITION. Вместо этого вы должны использовать прослушиватели кликов (см. SetOnItemClickListener (android.widget.AdapterView.OnItemClickListener)) или режим выбора (см. SetChoiceMode (int)). http://developer.android.com/resources/articles/touch-mode.html – jsaye

+0

ну в этом конкретном случае мне нужен прослушиватель для выбора, так как представление управляется физическими клавишами, и мне нужно дать некоторую форму обратной связи до того, как элемент будет выбран с помощью щелчка. –

+0

Каково содержание ваших элементов списка? Некоторые элементы управления, например флажки, будут перехватывать onClick. – jsmith

ответ

0

Проблема решена. Мне пришлось переопределить onContentChanged() и назначить моего слушателя ListView.

public class MyListActivity extends ListActivity { 

private Vibrator vibrator; 
private ListView mList; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE); 
    setContentView(R.layout.station_list); 
    // do some other stuff 
} 

@Override 
public void onContentChanged() { 
    super.onContentChanged(); 
    mList = (ListView)findViewById(android.R.id.list); 
    mList.setOnItemSelectedListener(mOnSelectedListener); 
} 

private AdapterView.OnItemSelectedListener mOnSelectedListener = new AdapterView.OnItemSelectedListener() { 
    public void onItemSelected(AdapterView parent, View v, int position, long id) { 
     onListItemSelected((ListView)parent, v, position, id);   
    } 

    public void onNothingSelected(AdapterView parent) { 
     // nothing to do here...    
    } 
}; 

    protected void onListItemSelected(ListView parent, View v, int position, long id) { 
    vibrator.vibrate(100); 
} 

    @Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    vibrator.vibrate(100); 
    Cursor c = cursor; 
    c.moveToPosition(position); 
    Intent i = new Intent(this, SomeOtherActivity.class); 
    i.putExtra(StationsDbAdapter.KEY_ROWID, id); 
    startActivity(i); 
} 

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    int action = event.getAction(); 
    int keyCode = event.getKeyCode(); 
    switch (keyCode) { 
    case KeyEvent.KEYCODE_VOLUME_DOWN: 
     if (action == KeyEvent.ACTION_DOWN) { 
      dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN)); 
      dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_DOWN)); 
     } 
     return true; 
    case KeyEvent.KEYCODE_VOLUME_UP: 
     if (action == KeyEvent.ACTION_DOWN) { 
      dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP)); 
      dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_UP)); 
     } 
     return true; 
    case KeyEvent.KEYCODE_MENU: 
     if (action == KeyEvent.ACTION_DOWN) { 
      dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER)); 
      dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER)); 
     } 
     return true; 
    default: 
     return super.dispatchKeyEvent(event); 
    } 
} 

}

Таким образом, я был в состоянии создать ListView, который можно использовать без сенсорного экрана и, таким образом, возможно, например, слепые люди, с которыми можно взаимодействовать.

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