Cela fait maintenant quelques jours que je joue avec cela et je n'arrive pas à le faire fonctionner. J'ai une activité qui affiche un fragment et ce fragment fait partie d'une liste de fragments que je consulte en utilisant ViewPager. Le fragment lui-même est composé d'un TextView et un ListView. Le ListView se remplit à partir d'un adaptateur personnalisé. Ce que j'essaye de faire est de passer un événement OnItemSelected au Fragment où il est manipulé. C'est probablement mieux pour moi d'aller de l'avant et de montrer du code ici.OnItemSelectedListener dans un fragment qui utilise un adaptateur personnalisé
C'est l'activité
public class DialogInventory extends FragmentActivity implements OnItemSelectedListener {
ViewPager viewPager;
Pager pager;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.dialog_inventory);
List<Fragment> fragList = new Vector<Fragment>();
fragList.add(Fragment.instantiate(this, FragmentOne.class.getName()));
fragList.add(Fragment.instantiate(this, FragmentTwo.class.getName()));
pager = new Pager(getSupportFragmentManager(), fragList);
viewPager = (ViewPager) findViewById(R.id.pagerMain);
viewPager.setAdapter(pager);
listMain = (ListView) findViewById(R.id.listMain);
listMain.setOnItemSelectedListener(this);
}
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
switch (viewPager.getCurrentItem()) {
case 0:
FragmentOne fragOne = new FragmentOne();
fragOne.onItemSelected(parent, view, pos, id);
break;
case 1:
FragmentTwo fragTwo = new FragmentTwo();
fragTwo.onItemSelected(parent, view, pos, id);
break;
}
}
public void onNothingSelected(AdapterView<?> arg0) {
}
C'est le Fragment:
public class FragmentOne extends Fragment implements OnItemSelectedListener {
View view;
ListView listMain;
ArrayList<String> invItems = new ArrayList<String>();
public FragmentOne() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) {
view = inflater.inflate(R.layout.fragment_one, viewGroup, false);
listMain = (ListView) v.findViewById(R.id.listMain);
listMain.setAdapter(new AdapterItem(getActivity().getApplicationContext(),
R.layout.tile_item, invItems));
listMain.setOnItemSelectedListener(this);
return view;
}
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
Log.i("Test", "hit");
}
Certaines lignes sont omises par souci de concision. Supposons que les Fragments soient affichés correctement et que tout fonctionne. La seule chose qui ne fonctionne pas correctement est que l'événement OnItemSelected dans l'activité ne se déclenche pas du tout ... et encore moins l'événement OnItemSelected dans le fragment. Qu'est-ce que je fais mal ici? Edit: les ListViews doivent être dans leurs Fragments respectifs (car ils seront affichés individuellement dans une activité différente ainsi que celle listée ci-dessus). Le plus gros problème ici est que je ne peux pas définir un OnItemSelectedListener dans mon Activity, par conséquent l'événement ne se déclenche jamais. J'ai tout le code menant à ce point travaillé et en cours d'exécution, c'est juste le OnItemSelectedListener qui ne fonctionne pas.
Edit2: Je vais ajouter une prime à cette question demain. À la lumière de cela, je pensais que je serais plus implicite sur la portée d'une réponse correcte. Une réponse correcte ne suggérerait aucun changement important dans la présentation ou la présentation de l'interface utilisateur. La réponse correcte transmet un événement OnItemSelected au fragment et y est traité. La réponse ne me ferait pas charger mon activité avec ligne après ligne de code pour réaliser quelque chose que je pense être faisable avec seulement quelques lignes. Les réponses les plus élégantes sont évidemment plus attrayantes. Merci à tous ceux qui y jettent un coup d'œil.
Le problème ici est que j'obtiens un NPE dans mon activité. Comment puis-je pointer vers un ListView qui existe dans une mise en page différente de celle de la classe dans laquelle il se trouve.
courir le risque de casser votre « Je ne veux pas changer l'interface utilisateur » règle, est-il une raison que vous n'utilisez pas 'ListFragment' qui, par défaut, vous donne une méthode pour' Override' qui attrape les clics sur un 'ListView' et ainsi vous pouvez faire ce que je crois que vous essayez de faire, qui est de gérer les clics de l'élément de liste localement dans le fragment ... http://developer.android.com /reference/android/app/ListFragment.html#onListItemClick(android.widget.ListView, android.view.View, int, long) –
oui, car le ListFragment remplit tout l'écran. Dans ce cas, je vais avoir des boutons en bas, et un titre TextView en haut – user1449018
Vous semblez avoir des choses en arrière: vous ne devriez pas essayer d'attraper les clics de l'élément de liste dans l'activité et les propager au fragment (s), mais plutôt les recevoir directement dans le fragment concerné. Fondamentalement, @SalilPandit a donné la bonne approche. Si vous utilisez un 'ListFragment' ou non, c'est à vous de décider, mais votre supposition qu'il remplit tout l'écran n'est pas correcte; c'est juste un fragment de commodité pour traiter les listes, mais vous pouvez le faire ressembler à ce que vous voulez, à condition de déclarer au moins un 'ListView' avec' @android: id/list'. –