Uso correcto de setEmtpyView en AdapterView

Realmente tengo problemas para usar el método setEmptyView. Lo intenté implementar en GridView y ListView, pero ambos no funcionaron. Aquí un código de ejemplo:

networkGames = (GridView) baseLayer.findViewById(R.id.all_game_grid_network); networkGames.setBackgroundResource(R.drawable.game_border); networkGames.setSelector(R.drawable.game_active_border); networkGames.setOnItemClickListener(new NetworkGameListener()); networkGames.setEmptyView(View.inflate(baseLayer, R.drawable.no_network_games, null)); networkGames.setAdapter(new NetworkAdapter()); 

El adaptador de red no contiene ningún elemento:

 private class NetworkAdapter extends BaseAdapter { /* (non-Javadoc) * @see android.widget.Adapter#getCount() */ @Override public int getCount() { return 0; } /* (non-Javadoc) * @see android.widget.Adapter#getItem(int) */ @Override public Object getItem(int position) { return null; } /* (non-Javadoc) * @see android.widget.Adapter#getItemId(int) */ @Override public long getItemId(int position) { return 0; } /* (non-Javadoc) * @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup) */ @Override public View getView(int position, View convertView, ViewGroup parent) { return null; } } 

También traté de llamar a networkGames.setAdapter (null), pero esto tampoco funciona. Mi emtpyView se parece a esto:

 <LinearLayout android:id="@+id/LinearLayout01" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <TextView android:text="There are currently no network games available. Start a new one." android:id="@+id/TextView01" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center"> </TextView> </LinearLayout> 

Realmente no sé lo que estoy haciendo mal. También leí varios tutoriales, pero ninguno de ellos metió problemas.

Debe agregar esta misma vista en el diseño en el que ha agregado el AdapterView.

AdapterView sólo cambia su visibilidad en función del contenido del adaptador.

EDITADO:
El diseño siguiente y el código funcionan bien:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:layout_width="fill_parent" android:layout_height="300dip" android:id="@+id/list_view" /> <TextView android:id="@+id/empty_list_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="List view is empty" android:visibility="gone" /> </LinearLayout> 

Código:

 ListView listView = (ListView) findViewById( R.id.list_view ); listView.setEmptyView( findViewById( R.id.empty_list_view ) ); listView.setAdapter( new ArrayAdapter( this, R.layout.selected_spinner_view, new ArrayList() ) ); 

La respuesta de Karan es inmejorable. El AdapterView de hecho muestra la vista vacía simplemente cambiando su propia visibilidad frente a la visibilidad de la vista vacía. Sin embargo, el diseño de vista vacía no necesariamente tiene que estar en el mismo archivo XML que el de AdapterView. Me pareció útil separar los dos porque uso un único archivo XML de presentación (que contiene un GridView) para múltiples actividades, pero quería especificar diferentes diseños de emptyView para cada uno de ellos.

La clave es agregar la vista vacía a la actividad con addContentView. Recuerde hacer esto después de haber llamado a setContentView especificando su AdapterView principal.

Mi código (en AbstractBaseActivity.onCreate):

 View mainView = inflater.inflate(R.layout.imagegrid, null); GridView gridView = (GridView)mainView.findViewById(R.id.gridView); View emptyView = inflater.inflate(getIdOfEmptyView(), null, false); gridView.setEmptyView(emptyView); // Any additional processing on mainView setContentView(mainView); addContentView(emptyView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

En cada actividad secundaria, reemito getIdOfEmptyView de la siguiente manera:

 @Override protected int getIdOfEmptyView() { return R.layout.emptyView_Favorites; } 

Puede definir archivos de diseño XML externos, inflarlos y establecerlos como una vista vacía. Lo único que hay que recordar es establecer el padre de la vista inflada.

 View emptyView = inflater.inflate(R.layout.id_of_your_layoout_file, parent, false); gridView.setEmptyView(emptyView); 

o

 listView.setEmptyView(emptyView); 

La respuesta de PacificSky me llevó casi a lo que necesitaba, pero agregar la vista vacía a la actividad con addContentView hizo que la vista vacía permaneciera en el contenedor de la actividad incluso después de eliminar el fragmento que contenía ListView de la actividad. Además, la diapositiva en el menú para la actividad se muestra debajo o mezclado con la vista vacía.

La solución para mí era agregar la vista vacía al contenedor pasado como un parámetro a onCreateView del fragmento:

 @Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ mFragmentContainer = container; mListView = (ListView) mLayout.findViewById(R.id.list_view); mEmptyListView = inflater.inflate(R.layout.empty_list, null, false); container.addView(mEmptyListView); mListView.setEmptyView(mEmptyListView); mListAdapter = new MyListAdapter(getActivity(), mList); mListView.setAdapter(mListAdapter); 

Y quitar la vista vacía del contenedor en el onDestroyView del fragmento:

 @Override public void onDestroyView(){ super.onDestroyView(); mFragmentContainer.removeView(mEmptyListView); } 
  • Implementación de setselection de customvisionview en Android
  • Extensión de AdapterView
  • El tipo nuevo AdapterView.OnItemClickListener () {} debe implementar el método abstracto heredado AdapterView.OnItemClickListener)
  • RequestLayout () incorrectamente llamado por android.widget.RelativeLayout android
  • Desplazamiento automático de AdapterView (Listview, GridView, ...)
  • Manera correcta de implementar onMeasure () y onLayout () en AdapterView personalizado
  • Android: stackFromBottom = "true" no parece funcionar perfectamente (revertir ListView con el adaptador)
  • MultiAutoCompleteTextView no funciona OnItemSelectedListener
  • RemoveView (View) no es compatible con AdapterView
  • Diferencia entre onItemClickListener y OnItemSelectedListener de AdapterView
  • Androide. ¿Cómo funciona el método notifyDataSetChanged () y ListViews?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.