2012-02-16 10 views
0

ブラインドユーザの使い勝手を向上させるために、特定のlistitemが選択されているときに、振動や音などの要素を追加するには、OnItemSelectedメソッドでListActivityが必要です。 は、したがって、私はListActivityクラスを拡張して、次のメソッドを追加しました:私は私の新しいクラスSelectableListActivityのインスタンスを作成し、onListItemSelectedメソッドをオーバーライドするときListActivity with Selectable Items

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

は今、まだ何も起こりません。何か案は?事前に多くの感謝!

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

}

Iが例えばためのタッチスクリーンなしで使用可能であり、リストビューを作成することとが可能であった。この方法盲目の人々と交流する。