2012-12-29 21 views
13

Używam układu kart (z przesunięciem). Tutaj mam 3 karty kontrolowane przez SectionsPagerAdapter. Każda karta to ListFragment.ListFragment onItemClickListener nie działa

Teraz chcę uzyskać zdarzenie uruchamiane po kliknięciu jednego z elementów na liście. Chciałbym słuchacza dla każdej karty.

Oto kod teraz (który nie działa, zdarzenie nie jest uruchamiane).

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; 
} 
} 

Co to jest, robię źle?

Bardzo dziękuję z góry!

Odpowiedz

36

Jeśli używasz ListFragment następnie można po prostu użyć jego metoda przesłanianie 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

Tak. Wyszedłem na to, ale nie mogłem odpowiedzieć na moje własne pytanie. (Zobacz komentarz do poniższego wpisu). Ale i tak bardzo dziękuję! :) – Whooper

+1

Yay! Nareszcie coś, co zadziałało! Spędziłem ostatnie pół godziny szukając rozwiązania, i to było to! Dzięki! – cw1998

+1

mnie uratował! w moim przypadku – k2ibegin

0

zmiana setListAdapter(adapter); do newsList.setAdapter(adapter);

+0

Hmm .. Nadal nie działa. Ale założę się, że to też był błąd. Dzięki! – Whooper

+2

Sam się zorientowałem :) Rozwiązaniem było zastąpienie onListItemClick z ListFragment :) Nie można odpowiedzieć z powodu niskiej reputacji. – Whooper

14

Wynika to z elementu listy niestandardowe. Domyślnym fokusiem jest niestandardowy element listy (przycisk/widok tekstu). Powoduje to ten problem.

Proszę dodać android:descendantFocusability="blocksDescendants" w głównym układzie elementu listy. Mam nadzieję, że to pomoże komuś.

+0

To zadziałało dla mnie, DZIĘKI! –

+3

Chciałbym móc to zrobić kilkanaście razy! –

0

Jeśli chcesz utworzyć lub ponownego wykorzystania lub istniejącej obsługi, która implementuje AdapterView.OnItemClickListener, zamiast wdrażania onListItemClick() w ListFragment, można to zrobić poprzez uzyskanie odniesienie do ListView z ListFragment i ustawienie jego słuchacza. W twojej ListFragment.onResume() można zrobić:

@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"); 
     } 
    }); 
} 

w moim przypadku mogę używać tego samego słuchacza z Activity z ListView, A ListActivity lub ListFragment, np

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