Así que he estado jugando con esto durante unos días y parece que no funciona. Tengo una Actividad que muestra un Fragmento y ese Fragmento es un miembro de una lista de Fragmentos que publico usando ViewPager. El Fragmento en sí está compuesto por un TextView y un ListView. ListView se rellena desde un Adaptador personalizado.OnItemSelectedListener en un fragmento que usa un adaptador personalizado
Lo que intento hacer es pasar un evento OnItemSelected al Fragmento donde se maneja. Probablemente sea mejor para mí seguir adelante y mostrar el código aquí.
Esta es la actividad
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) {
}
Este es el fragmento:
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");
}
Algunas líneas se omiten por razones de brevedad. Vamos a suponer que los Fragmentos se muestran correctamente y que todo funciona. Lo único que no funciona correctamente es que el evento OnItemSelected en la actividad no se activa en absoluto ... mucho menos el evento OnItemSelected en el fragmento. ¿Qué estoy haciendo mal aquí?
Editar: las ListViews deben estar en sus respectivos Fragmentos (ya que se mostrarán individualmente en una Actividad diferente, así como la que se menciona arriba). El mayor problema aquí es que no puedo establecer un OnItemSelectedListener en mi actividad, por lo tanto, el evento nunca se dispara. Tengo todo el código que conduce a ese punto elaborado y en funcionamiento, es solo el OnItemSelectedListener que no funciona.
Edit2: Voy a agregar una recompensa a esta pregunta mañana. A la luz de eso, pensé que estaría más implícito en el alcance de una respuesta correcta. Una respuesta correcta no sugiere cambios drásticos en el diseño o la presentación de la interfaz de usuario. La respuesta correcta pasará un evento OnItemSelected al Fragmento y se manejará allí. La respuesta no me haría cargar mi actividad con una línea tras otra de código para lograr algo que creo que se puede hacer con solo unas pocas líneas. Las respuestas más elegantes son obviamente más atractivas. Gracias a todos los que miran esto.
El problema aquí es que obtengo un NPE en mi actividad. ¿Cómo apunto a un ListView que existe en un diseño diferente que el Diseño de la clase en la que se encuentra.
correr el riesgo de romper su "No quiero cambiar la interfaz de usuario" regla, hay una razón por la que no está utilizando un 'ListFragment' que por defecto le da un método para' Override' que capta los clics en un 'ListView' y así puede hacer lo que creo que está tratando de hacer, que es manejar los clics de los elementos de la lista localmente en el fragmento ... http://developer.android.com /reference/android/app/ListFragment.html#onListItemClick(android.widget.ListView, android.view.View, int, long) –
sí, porque ListFragment llena toda la pantalla. En este caso, tendré botones en la parte inferior y un título TextView en la parte superior. – user1449018
Parece que tiene las cosas en orden: no debería tratar de captar los clics de elementos de la lista en la actividad y propagarlos al fragmento (s), sino más bien recíbalos en el fragmento relevante directamente. Básicamente @SalilPandit ha dado el enfoque correcto. Si usted usa un 'ListFragment' o no depende de usted, su suposición de que" llena la pantalla completa "no es correcta; es solo un fragmento de conveniencia para tratar con listas, pero puede hacer que parezca lo que quiera, siempre que al menos declare un 'ListView' con' @android: id/list'. –