您的方法無法正常工作的原因有很多。
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
爲該位置重新創建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
。
另請注意,如果View
可點擊或不可用,則適配器中的isEnabled
似乎不起作用。我不知道如何解釋。這意味着如果你想要控制View
的這個屬性,Adapter
需要設置當創建View
並以某種方式維護該信息時。
你們都是正確的。現在的工作,感謝有一個很難獲得的最後一個項目的位置 – Axarydax