Così ho giocato con questo per alcuni giorni e proprio non riesco a farlo funzionare. Ho un'attività che visualizza un frammento e quel frammento è un membro di un elenco di frammenti che ho sfogliato usando ViewPager. Il frammento stesso è composto da un TextView e un ListView. ListView si popola da un adattatore personalizzato.OnItemSelectedListener in un frammento che utilizza un adattatore personalizzato
Quello che sto cercando di fare è passare un evento OnItemSelected al Frammento in cui viene gestito. Probabilmente è meglio per me andare avanti e mostrare il codice qui.
Questa è l'attività
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) {
}
Questo è il frammento:
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");
}
Alcune linee sono omesse per brevità. Partiamo dal presupposto che i Frammenti vengano visualizzati correttamente e che tutto funzioni. L'unica cosa che non funziona correttamente è che l'evento OnItemSelected nell'Attività non sta sparando affatto ... tanto meno l'evento OnItemSelected nel frammento. Cosa sto facendo di sbagliato qui?
Modifica: le ListViews devono essere nei rispettivi frammenti (in quanto verranno visualizzati singolarmente in un'attività diversa, oltre a quella elencata sopra). Il problema più grande qui è che non posso impostare un OnItemSelectedListener nella mia attività, quindi l'evento non viene mai sparato. Ho tutto il codice che porta a quel punto elaborato e funzionante, è solo l'OnItemSelectedListener che non funziona.
Edit2: Domani aggiungerò una taglia a questa domanda. Alla luce di ciò ho pensato che sarei stato più implicito nello scopo di una risposta corretta. Una risposta corretta non suggerirebbe modifiche radicali al layout o alla presentazione dell'interfaccia utente. La risposta corretta passerà un evento OnItemSelected al Fragment e verrà gestito lì. La risposta non mi permetterebbe di caricare la mia attività con una riga dopo l'altra del codice per ottenere qualcosa che ritengo possa fare solo poche righe. Le risposte più eleganti sono ovviamente più accattivanti. Grazie a tutti coloro che danno un'occhiata a questo.
Il problema qui è che ottengo un NPE nella mia attività. Come faccio a puntare a un ListView che esiste in un layout diverso rispetto al Layout della classe in cui è.
correre il rischio di rompere il vostro "Io non voglio cambiare l'interfaccia utente" regola, c'è una ragione per cui non si utilizza un 'ListFragment' che di default fornisce un metodo per' Override' che cattura i clic su un 'ListView' e quindi puoi fare ciò che credo tu stia cercando di fare, ovvero gestire gli elementi della lista cliccando localmente nel frammento ... http://developer.android.com /reference/android/app/ListFragment.html#onListItemClick(android.widget.ListView, android.view.View, int, long) –
sì, perché il ListFragment riempie l'intero schermo. In questo caso avrò i pulsanti in basso e il titolo TextView in alto – user1449018
Sembra che le cose stiano andando in primo piano: non dovresti cercare di catturare i clic dell'elemento dell'elenco nell'attività e propagarli al frammento (s), ma piuttosto riceverli direttamente nel relativo frammento. Fondamentalmente @SalilPandit ha dato l'approccio corretto. Sia che tu usi un 'ListFragment' o no dipende da te, ma il tuo presupposto che lo schermo" riempie tutto "non è corretto; è solo un comodo frammento per gestire gli elenchi, ma puoi farlo sembrare come vuoi, purché tu dichiari almeno un 'ListView' con' @android: id/list'. –