您的方法行不通的原因有多种。
1) onItemClick 仅因键盘事件而被调用。特别是KeyKevent.KEYCODE_ENTER。它不是通过任何其他代码路径调用的。因此,仅当您尝试提供键盘/轨迹球支持时,处理这种情况才有用。
AbsListView相关方法的Android源码:
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 重新创建@987654331 时重新创建它@那个位置。
3) 您需要处理onClick 事件,以便实际点击View。你在哪里处理这取决于你。最好的地方可能是您的Adapter,然后可能会或可能不会将其传递给您的Activity,具体取决于您的设计要求。那是您需要处理触摸事件的地方。
查看此代码以获得简单的 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;
}
}
}
如果您执行此代码并单击ListView 中的任何Views,您将在logcat 输出中注意到只有onClick 被调用。 onItemClick 永远不会被调用。
还要注意,适配器中的isEnabled 似乎不会影响View 是否可点击。我不知道如何解释。这意味着,如果您想控制 View 的该属性,则需要在创建 View 时设置 Adapter 并以某种方式维护该信息。