あなたのアプローチがうまくいかない理由は複数あります。
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)実際にView
がクリックされた場合は、onClick
イベントを処理する必要があります。あなたがこれを扱うところはあなた次第です。最良の場所はおそらくAdapter
で、設計要件に応じてActivity
に渡すかどうかは同じです。それがあなたのタッチイベントを処理する必要がある場所です。あなたは、このコードを実行し、あなただけonClick
が呼び出されているlogcat出力に気づくでしょうListView
にView
Sのいずれかをクリックすると
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;
}
}
}
:
は、単純な活動のためにこのコードを参照してください。 onItemClick
は決して呼び出されません。
また、View
をクリックするとアダプターのisEnabled
が有効に見えないことにも注意してください。私はそれをどのように解釈するか分からない。しかし、View
のプロパティを制御したい場合は、View
が作成されたときに、その情報を保持する必要があることをAdapter
が設定する必要があることを意味します。
あなたのすべての項目のクリックを無効にしたい場合は、正しいです。ありがとうございました – Axarydax