Существует несколько причин, по которым ваш подход не будет работать.
1) onItemClick
вызывается только из-за событий клавиатуры. В частности KeyKevent.KEYCODE_ENTER
. Он не вызывается через любой другой путь кода. Таким образом, даже если вы пытаетесь обеспечить поддержку клавиатуры / трекбола, это полезно.
Исходный код Android для соответствующих методов AbsListView:
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
if (!isEnabled()) {
return true;
}
if (isClickable() && isPressed() &&
mSelectedPosition >= 0 && mAdapter != null &&
mSelectedPosition < mAdapter.getCount()) {
final View view = getChildAt(mSelectedPosition - mFirstPosition);
if (view != null) {
performItemClick(view, mSelectedPosition, mSelectedRowId);
view.setPressed(false);
}
setPressed(false);
return true;
}
break;
}
return super.onKeyUp(keyCode, event);
}
public boolean performItemClick(View view, int position, long id) {
if (mOnItemClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
mOnItemClickListener.onItemClick(this, view, position, id);
return true;
}
return false;
}
2) Вы настраиваете активируемую информацию прямо в представлении. Представления, отображаемые через любой AdapterView
, являются эфирными. Они создаются по запросу AdapterView
и существуют только до тех пор, пока они нужны AdapterView
. Вы не должны устанавливать на них данные, которые хотите сохранить. Вы можете вызвать setEnabled
и setClickable
на них для немедленного эффекта, но если вы хотите, чтобы эта информация сохранялась, вам нужно сохранить ее где-нибудь, к чему у Adapter
есть доступ, чтобы ее можно было воссоздать, когда AdapterView
воссоздает View
для этой позиции.
3) Вам нужно обработать событие onClick
для фактического нажатия View
. Где вы справляетесь, зависит от вас. Лучшее место - это, вероятно, ваш Adapter
, который может или не может передать его вашему Activity
в зависимости от ваших требований к дизайну. Вот где вам нужно обрабатывать сенсорные события.
См. Этот код для простого упражнения:
public class PhoneTesting extends Activity {
private static final String TAG = "PhoneTesting";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(TAG, "onCreate()");
List<String> strings = new ArrayList<String>();
for(int i = 0 ; i < 20 ; i++) {
strings.add(Integer.toString(i));
}
ListView list = (ListView) this.findViewById(R.id.list);
list.setAdapter(new SimpleAdapter(this, 0, 0, strings));
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, "onItemClick: " + id);
}
});
}
class SimpleAdapter extends ArrayAdapter<String> implements OnClickListener {
SimpleAdapter(Context context, int resource, int textViewResourceId, List<String> objects) {
super(context, resource, textViewResourceId, objects);
}
SimpleAdapter(Context context, int resource, int textViewResourceId, String[] objects) {
super(context, resource, textViewResourceId, objects);
}
SimpleAdapter(Context context, int resource, int textViewResourceId) {
super(context, resource, textViewResourceId);
}
SimpleAdapter(Context context, int textViewResourceId, List<String> objects) {
super(context, textViewResourceId, objects);
}
SimpleAdapter(Context context, int textViewResourceId, String[] objects) {
super(context, textViewResourceId, objects);
}
SimpleAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView b = position % 2 == 0 ? new Button(this.getContext()) : new TextView(this.getContext());
b.setText(this.getItem(position));
b.setOnClickListener(this);
return b;
}
@Override
public void onClick(View v) {
TextView t = (TextView) v;
Log.d(TAG, "onClick: " + t.getText());
}
@Override
public boolean isEnabled(int position) {
return position % 2 == 0 ? false : true;
}
}
}
Если вы выполните этот код и нажмете на любой из View
s в ListView
, вы увидите в выводе logcat, что вызывается только onClick
. onItemClick
никогда не вызывается.
Также обратите внимание, что isEnabled
в адаптере, кажется, не действует, если View
активен или нет. Я не уверен, как это интерпретировать. Однако это означает, что если вы хотите управлять этим свойством View
, Adapter
необходимо установить его при создании View
и как-то поддерживать эту информацию.