Ci sono diversi motivi per cui il tuo approccio non funzionerà.
1) onItemClick
viene chiamato solo a causa di eventi di tastiera. Specificamente KeyKevent.KEYCODE_ENTER
. Non viene chiamato tramite alcun altro percorso di codice. Quindi, gestirlo è utile solo se si sta tentando di fornire supporto per tastiera/trackball.
codice sorgente di Android per i metodi rilevanti 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) Si sta impostando le informazioni cliccabile direttamente sulla vista. Le visualizzazioni visualizzate tramite qualsiasi AdapterView
sono eteree. Vengono creati su richiesta dello AdapterView
e esistono solo finché il AdapterView
ne ha bisogno. Non dovresti impostare alcun dato su di essi che desideri conservare. È possibile chiamare setEnabled
e setClickable
su di essi per ottenere l'effetto immediato, ma se si desidera che tali informazioni persistano è necessario memorizzarle in un punto che l'Adapter
abbia accesso in modo che possa essere ricreato quando lo AdapterView
ricrea la View
per quella posizione.
3) È necessario gestire l'evento onClick
per l'effettivo View
che viene fatto clic. Dove gestisci questo dipende da te. Il posto migliore è probabilmente il tuo Adapter
che poi può o non può passarlo al tuo Activity
a seconda di quali sono i tuoi requisiti di progettazione. È qui che devi gestire i tuoi eventi touch.
Vedi questo codice per una semplice attività:
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;
}
}
}
Se si esegue questo codice e fare clic su uno qualsiasi dei View
s nel ListView
si noterà nell'output logcat che solo onClick
viene chiamato. onItemClick
non viene mai chiamato.
Si noti inoltre che isEnabled
nell'adattatore non sembra avere effetto se lo View
è selezionabile o meno. Non sono sicuro di come interpretarlo. Tuttavia, ciò significa che se si desidera controllare la proprietà di Adapter
, è necessario impostare Adapter
quando viene creato lo strumento View
e in qualche modo conservare tali informazioni.
tutti voi sono corretti. Ora funziona, grazie – Axarydax