OnItemSelectedListener en un fragmento que utiliza un adaptador personalizado

Así que he estado jugando con esto durante unos días y simplemente no puede parecer para conseguir que funcione. Tengo una Actividad que muestra un Fragmento y ese Fragmento es un miembro de una lista de Fragmentos con los que hago clic usando ViewPager. El Fragmento en sí se compone de un TextView y un ListView. El ListView se llena de sí mismo desde un adaptador personalizado.

Lo que estoy tratando de hacer es pasar un evento OnItemSelected de nuevo al fragmento donde se maneja. Probablemente sea mejor para mí seguir adelante y mostrar 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 brevedad. Vamos a ir en el supuesto de 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 está disparando en absoluto … mucho menos el evento OnItemSelected en el fragmento. ¿Qué estoy haciendo mal aquí?

Editar: los ListViews deben estar en sus respectivos fragmentos (ya que se mostrarán individualmente en una actividad diferente, así como la enumerada anteriormente). El mayor problema aquí es que no puedo establecer un OnItemSelectedListener en mi actividad, por lo tanto, el evento nunca se disparó. Tengo todo el código que conduce hasta ese punto trabajado y corriendo, es sólo el OnItemSelectedListener que no funciona.

Edit2: Voy a añadir 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 sugeriría cambios dramáticos en el diseño o la presentación de la interfaz de usuario. La respuesta correcta pasará un evento OnItemSelected al fragmento y se tratará allí. La respuesta no me obligaría a cargar mi actividad con línea tras línea de código para lograr algo que siento es factible con sólo unas pocas líneas. Las respuestas más elegantes son obviamente más atractivas. Gracias a cualquiera que eche un vistazo a esto.

El problema aquí es que obtengo un NPE en mi actividad. ¿Cómo lo apunto a un ListView que existe en un diseño diferente que el Layout de la clase en la que está.

¿Dónde se utiliza listView.setOnItemSelectedListener(this) ? Debe informar explícitamente al ListView que su actividad debe controlar los comportamientos de la interfaz de usuario …

Y en su Fragmento añadir:

 listMain.setOnItemSelectedListener(this); 

Crear su propia interfaz y Callback es probablemente la mejor solución. En mi aplicación hice algo como esto:

 public class ModuleFragment extends ListFragment { //... private OnModuleSelectedListener mdListener; // this method makes sure my activity implements my interface. If not I show an error public void onAttach(Activity activity) { super.onAttach(activity); try { mdListener = (OnModuleSelectedListener) activity; Log.d(TAG, "OnModuleSelectedListener Implemented !"); } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnSqSelectedListener"); } } // This is the standard onListItemClick, I use it to get data I need and give them to the Listener public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); l.getItemAtPosition(position); HashMap<String, String> map = (HashMap<String, String>) l .getItemAtPosition(position); mdId = map.get("id"); mdName = map.get("name"); mdListener.onModuleSelected(mdId,mdName); } public interface OnModuleSelectedListener { public void onModuleSelected(String mdId, String mdName); } } 

Aquí está mi actividad:

 public class Main extends Activity implements OnModuleSelectedListener{ //... public void onModuleSelected(String mdId, String mdName) { //.. I do whatever I want with what I get from the list } } 

Espero que te ayude un poco. Esa es la respuesta más cercana a su pregunta que puedo darle.

También he estado tratando de hacer algo similar a esto. El problema reside en el hecho de que usted no tiene una instancia en la actividad con la que establecer un oyente onitemselected. Yo, personalmente, intenté todo lo que podía pensar en conseguir esto para trabajar. Incluso:

 list = (ListView) vp.getRootView().findViewById(R.id.listMain); list.setOnItemSelectedListener(this); 

Donde lista es una vista de lista que instancia y luego establece en la lista del fragmento. El problema con este enfoque es que obtiene un NPE cuando intenta establecer el oyente a esto. Si encuentra una respuesta a esta pregunta, por favor, envíela aquí. Me ayudaría una tonelada.

He hecho sugerir a la gente que tomo un nuevo enfoque y simplemente re-crear la lista cada vez que se llama al viewpager (sin realmente paginación .. crear la ilusión de un golpe cuando en realidad la vista nunca cambia) y he Si la gente sugiriera usar un ListFragment … ListFragment sería bueno, pero luego no puedes incluir nada más en tu diseño excepto un ListFragment.

En su FragmentActivity, en lugar de utilizar OnItemSelectedListener, quizás puede utilizar un método estático para realizar el trabajo. Y llamar a este método en onItemSelected () (en fragmento).

Implementar una interfaz en la actividad principal del fragmento resolverá su problema. Por ejemplo. TestFragment contiene una interfaz denominada TestFragmentListener. Implementar esta interfaz de escucha en su actividad principal y mantener la referencia de la interfaz en el fragmento para hacer el método callback.OnItemSelectedListener hacer la devolución de llamada a la actividad principal y manejar el resto como de costumbre. Consulte el siguiente código de ejemplo.

 public final class TestFragment extends Fragment { TextView title; ListView listView; TestFragmentListener mActivity; TestAdapter adapter; public interface TestFragmentListener { public void onItemSelected(Object o); } public static TestFragment newInstance(String content) { TestFragment fragment = new TestFragment(); return fragment; } @Override public void onAttach(Activity activity) { try { mActivity = (TestFragmentListener) activity; } catch (ClassCastException e) { Log.e("Invalid listerer", e.getMessage()); } super.onAttach(activity); } @Override public void onDetach() { super.onDetach(); mActivity = null; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View vw = inflater.inflate(R.layout.layout, container, false); title = (TextView) vw.findViewById(R.id.textView1); listView = (ListView) vw.findViewById(R.id.listView1); return vw; } @Override public void onActivityCreated(Bundle savedInstanceState) { TestAdapter adapter = new TestAdapter(); listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { } }); listView.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { mActivity.onItemSelected(arg2); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); super.onActivityCreated(savedInstanceState); } 

 private class TestAdapter extends BaseAdapter { @Override public int getCount() { return 100; } @Override public Object getItem(int arg0) { return null; } @Override public long getItemId(int arg0) { return arg0; } @Override public View getView(int position, View convertView, ViewGroup container) { TextView tv = new TextView((Activity) mActivity); tv.setText(Integer.toString(position)); return tv; } } } 
  • Android ListView con CursorAdapter tiene la posición de desplazamiento incorrecta después de Requery se llama cuando se agregan nuevos elementos
  • Cómo mostrar la barra de progreso (círculo) en una actividad que tiene un listview antes de cargar el listview con datos
  • Android ListView: Encabezado / Pie de página que llena el espacio restante en la pantalla
  • ListView superpone otro diseño al desplazarse
  • Cómo determinar cuándo ListView se ha completado
  • ListView de búsqueda múltiple
  • Android: el evento onItemClick () de ListView no se llama
  • Elemento seleccionado en listview personalizado con barra de acción contextual
  • Cómo agregar ListView personalizado en el diálogo de alerta android
  • Cómo hacer que android listview desplazable?
  • Android ListView - se desplaza de nuevo al principio en la actualización
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.