Dove posso inserire l'onClickListener su un ListView personalizzato?

Sto facendo un ListView personalizzato delle righe contenenti un CheckBox e un TextView . Prima di utilizzare ListViews personalizzati con SimpleCursorAdapter, il mio onListItemClick() funzionava bene.

Ho letto che devo aggiungere un onClickListener ai miei TextViews ma WHERE? E perché?

  • Equalizzatore non sempre supportto, anche quando api> = 9?
  • NavUtils.navigateUpTo () non inizia alcuna attività
  • come get il codice json nella mia applicazione
  • Quando si aggiunge Facebook SDK "appeventslogger.activateapp (this)" viene visualizzato deprecato
  • La connessione a Internet in emulatore android mostra sempre lo stato connesso
  • Come superare onPushReceive () di ParsePushBroadcastReceiver?
  • Sto ancora estendendo ListActivity e passando un Adapter a setListAdapter(listedPuzzleAdapter); , non lo sono?

     public class PuzzleListActivity extends ListActivity { private PuzzlesDbAdapter mDbHelper; private Cursor puzzlesCursor; private ArrayList<ListedPuzzle> listedPuzzles = null; private ListedPuzzleAdapter listedPuzzleAdapter; private class ListedPuzzleAdapter extends ArrayAdapter<ListedPuzzle> { private ArrayList<ListedPuzzle> items; public ListedPuzzleAdapter(Context context, int textViewResourceId, ArrayList<ListedPuzzle> items) { super(context, textViewResourceId, items); this.items = items; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.puzzles_row, null); } ListedPuzzle lp = items.get(position); if (lp != null) { TextView title = (TextView) v.findViewById(R.id.listTitles); title.setText(lp.getTitle()); CheckBox star = (CheckBox) v.findViewById(R.id.star_listed); star.setChecked(lp.isStarred()); } return v; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.puzzles_list); // Create database helper to open connection mDbHelper = new PuzzlesDbAdapter(this); mDbHelper.open(); fetchData(); } private void fetchData() { puzzlesCursor = mDbHelper.fetchAllPuzzles(); startManagingCursor(puzzlesCursor); listedPuzzles = new ArrayList<ListedPuzzle>(); ListedPuzzle lp; puzzlesCursor.moveToFirst(); while (!puzzlesCursor.isAfterLast()) { lp = new ListedPuzzle(); lp.setTitle(puzzlesCursor.getString(puzzlesCursor .getColumnIndex(PuzzlesDbAdapter.KEY_TITLE))); lp.setStarred(puzzlesCursor.getInt(puzzlesCursor .getColumnIndex(PuzzlesDbAdapter.KEY_STARRED)) > 0); listedPuzzles.add(lp); puzzlesCursor.moveToNext(); } listedPuzzleAdapter = new ListedPuzzleAdapter(this, R.layout.puzzles_row, listedPuzzles); setListAdapter(listedPuzzleAdapter); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Intent i = new Intent(this, PuzzleQuestionActivity.class); i.putExtra(PuzzlesDbAdapter.KEY_ROWID, id); startActivity(i); } 

    EDIT: La mia domanda era di rendere l'articolo completo di un ListView personalizzato cliccabile in modo da ho trovato la migliore risposta è stata quella di @Luksprog. La onListItemClick dalla mia ListActivity era sufficiente. Ho solo bisogno di impostare l' android:focusable='false' per farlo funzionare.

    Ora, il CheckBox su ciascuna voce del ListView dovrebbe "star" quella voce, il che significa accedere al DB.

     public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.puzzles_row, null); } ListedPuzzle lp = items.get(position); if (lp != null) { TextView title = (TextView) v.findViewById(R.id.listTitles); title.setText(lp.getTitle()); CheckBox star = (CheckBox) v.findViewById(R.id.star_listed); star.setChecked(lp.isStarred()); star.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Integer realPosition = (Integer) v.getTag(); ListedPuzzle obj = items.get(realPosition); obj.getId(); } }); } return v; } 

    Ma il v.getTag() riferisce a una variabile non finale e se lo modifico non si può assegnare il v = vi.inflate(R.layout.puzzles_row, null) . Qual è il modo migliore per risolvere questo problema? Non ho mai capito veramente l'intera offerta finale.

  • Fai la richiesta di volley in una discussione diversa
  • Posso mantenere il riconoscitore vocale ad ascoltare indefinitamente?
  • sfuggendo caratteri speciali come & in android xml
  • Come faccio a realizzare BOND un dispositivo?
  • findViewById () restituisce null - tried EVERYTHING
  • Android Studio w / gradle: Il pacchetto r non esiste
  • 5 Solutions collect form web for “Dove posso inserire l'onClickListener su un ListView personalizzato?”

    Se si desidera aggiungere un'azione speciale per quando si fa clic sul TextView e / o su CheckBox da una qualsiasi delle righe del ListView quindi aggiungere un OnCLickListener per quelle Views nel metodo getView del proprio Adapter :

      @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.puzzles_row, null); } ListedPuzzle lp = items.get(position); if (lp != null) { TextView title = (TextView) v.findViewById(R.id.listTitles); //set as the tag the position parameter title.setTag(new Integer(position)); title.setOnclickListener(new OnCLickListener(){ @Override public void onClick(View v) { // Do the stuff you want for the case when the row TextView is clicked // you may want to set as the tag for the TextView the position paremeter of the `getView` method and then retrieve it here Integer realPosition = (Integer) v.getTag(); // using realPosition , now you know the row where this TextView was clicked } }); title.setText(lp.getTitle()); CheckBox star = (CheckBox) v.findViewById(R.id.star_listed); star.setChecked(lp.isStarred()); } return v; } 

    Se si desidera eseguire un'azione quando si fa clic su una row (a prescindere dalla View da quella row (se si è scattato), utilizzare l' OnItemClickListener sul ListView (o il callback onListItemClick nel caso di ListActivity ).

    Inoltre, spero di impostare android:focusable="false" per il CheckBox (in R.layout.puzzles_row ) perché non penso che onListItemClick funziona altrimenti.

    Modifica:

    onListItemClick la nuova Activity nel onListItemClick (nel caso della ListActivity ) se si desidera avviare la nuova attività, indipendentemente da where l'utente fa clic su una row :

     @Override protected void onListItemClick(ListView l, View v, int position, long id) { Intent i = new Intent(this, PuzzleQuestionActivity.class); i.putExtra(PuzzlesDbAdapter.KEY_ROWID, id); startActivity(i); } 

    Se per qualche motivo si desidera avviare la nuova Activity quando l'utente fa clic solo (ad esempio) il TextView in una row di ListView quindi avviare la nuova attività nel metodo onClick dal codice precedente:

     //... title.setOnclickListener(new OnCLickListener(){ @Override public void onClick(View v) { Integer realPosition = (Integer) v.getTag(); ListedPuzzle obj = items.get(realPosition); Intent i = new Intent(this, PuzzleQuestionActivity.class); i.putExtra(PuzzlesDbAdapter.KEY_ROWID, obj.getTheId());//see below startActivity(i); } //... 

    Per far funzionare questo, dovrai modificare ListedPuzzle per aggiungere anche la colonna PuzzlesDbAdapter.KEY_ROWID dal cursore cursori nel metodo fetchData() :

     //... while (!puzzlesCursor.isAfterLast()) { lp = new ListedPuzzle(); lp.setTitle(puzzlesCursor.getString(puzzlesCursor .getColumnIndex(PuzzlesDbAdapter.KEY_TITLE))); lp.setStarred(puzzlesCursor.getInt(puzzlesCursor .getColumnIndex(PuzzlesDbAdapter.KEY_STARRED)) > 0); lp.setTheId(puzzlesCursor.getLong(puzzlesCursor .getColumnIndex(PuzzlesDbAdapter.KEY_ROWID))); listedPuzzles.add(lp); //... 

    è ansible assegnare un onClickListener nella scheda, ma è una pratica negativa.

    quello che dovresti fare è implementare onItemClick come questo:

     @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { TextView text = parent.getItemAtPosition(position); // DO SOMETHING or in your case //startActivity(new Intent(<the correct intent>); } 

    Dovresti implementare onItemClickListener sul tuo ListView.

     ListView lv = getListView(); lv.setOnItemClickListener(new OnItemClickListener() { }); 

    Utilizza solo OnClick Listner solo nell'adattatore. Nell'adattatore stai tornando v che è la vista kiond dell'object. Inserisci il tuo onCLickListener.

    egvsetOnCLickListener.

    Sto tenendo presente che si desidera aprire un'attività sul click di visualizzazione. E sì, se la tua class ListedPuzzle è serializzabile o parcelable puoi inoltrare l'integer object utilizzando il metodo di intenti putextra.

    Se non sei chiaro con la risposta mi dica che ti fornirò lo snippet di codice di samll

      lstviewemojis.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.