2012-12-29 2 views
13

Sto usando il layout a schede (con scorrimento). Qui ho 3 schede con un SectionsPagerAdapter controllato. Ogni scheda è un ListFragment.ListFragment onItemClickListener non funziona

Ora voglio far scattare un evento quando si fa clic su uno degli elementi nell'elenco. Vorrei un ascoltatore per ogni scheda.

Ecco il codice ora (che non funziona, l'evento non viene attivato).

public class NyhederFragment extends ListFragment { 
    public static final String ARG_SECTION_NUMBER = "section_number"; 
    private static final String TAG="NyhederFragment"; 
    private List<Item> newsItems; 
    private ArrayList newsHeadlines; 
    private ArrayAdapter adapter; 
    private BroadcastReceiver updateReciever; 

public NyhederFragment() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    ListView newsList = new ListView(getActivity()); 
    newsList.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 
    newsList.setId(R.id.list); 
    DatabaseHelper dbConn = new DatabaseHelper(getActivity()); 

    newsItems = dbConn.getAllItemsFromNews(); 
    newsHeadlines = new ArrayList(); 
    for(Item i : newsItems){ 
     newsHeadlines.add(i.getTitle()); 
    } 

    adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, newsHeadlines); 

    setListAdapter(adapter); 

    newsList.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
      Log.i("debug", "single click"); 
     } 
    }); 

    dbConn.close(); 

    getActivity().registerReceiver(updateReciever, new IntentFilter("ArticlesUpdated")); 
    return newsList; 
} 
} 

Che cos'è, sto sbagliando?

Grazie mille in anticipo!

risposta

36

Se si utilizza ListFragment allora si può semplicemente utilizzare il suo metodo di sostituzione onListItemClick()

@Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     // TODO Auto-generated method stub 
     super.onListItemClick(l, v, position, id); 
    } 
+1

Sì. L'ho capito ma non ho potuto rispondere alla mia domanda. (Vedi il commento sotto il post). Ma grazie mille comunque! :) – Whooper

+1

Yay! Finalmente qualcosa che ha funzionato! Ho passato l'ultima mezz'ora a cercare una soluzione, e così è stato! Grazie! – cw1998

+1

mi ha salvato! nel mio caso – k2ibegin

0

cambiamento setListAdapter(adapter); a newsList.setAdapter(adapter);

+0

Hmm .. Ancora non funziona. Ma scommetto che anche questo è stato un errore. Grazie! – Whooper

+2

L'ho calcolato io stesso :) La soluzione era di ignorare onListItemClick da ListFragment :) Tuttavia, non è possibile rispondere a causa della scarsa reputazione. – Whooper

14

E 'dovuto l'articolo elenco personalizzato. L'impostazione predefinita è l'elemento dell'elenco personalizzato (pulsante/vista testo). Causa questo problema.

Aggiungere android:descendantFocusability="blocksDescendants" nel layout radice dell'elemento di elenco. Spero che questo aiuti qualcuno.

+0

Questo ha funzionato per me, GRAZIE! –

+3

Vorrei poterlo revocare una dozzina di volte! –

0

Se si voleva creare o ri-uso o un gestore esistente che implementa AdapterView.OnItemClickListener, piuttosto che attuare onListItemClick() all'interno del ListFragment, puoi farlo ottenendo un riferimento alla ListView del ListFragment e impostando il suo ascoltatore. Nella tua ListFragment.onResume() si potrebbe fare:

@Override 
public void onResume() { 
    super.onResume(); 
    ListView listView = getListView(); 
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Log.d("TAG", "Stop touching me"); 
     } 
    }); 
} 

Nel mio caso, posso usare lo stesso ascoltatore da un Activity con un ListView, un ListActivity o un ListFragment, per esempio

listView.setOnItemClickListener(new MyListViewOnClickListener(getActivity()));