您的方法不起作用的原因有很多。

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显示的视图都是空灵的。它们是根据“20”的要求创建的,只有在“20”需要它们时才存在。您不应该在其上设置要保留的任何数据。您可以立即调用setEnabled和setClickable但是如果您希望该信息持续存在,则需要将其存储在Adapter可以访问的某个位置,以便当AdapterView重新创建该位置的View时可以重新创建它。

3)你需要处理实际View被点击的onClick事件。你在哪里处理这取决于你。最好的地方可能是你的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 strings = new ArrayList();

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 implements OnClickListener {

SimpleAdapter(Context context, int resource, int textViewResourceId, List 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 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永远不会被召唤。

另请注意,如果View是可点击的,适配器中的isEnabled似乎没有效果。我不知道如何解释。这意味着,如果你想控制View的属性,Adapter需要设置当创建View并以某种方式维护该信息。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐