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:
- No se puede iniciar la actividad: UnsupportedOperationException: addView (View, LayoutParams) no es compatible con AdapterView
- GridView.setOnItemClickListener no funciona
- GridView con el botón del menú del filtro en Android
- AdapterView.OnItemClickListener con más ListView
- Android AdapterView?
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.
- ¿Qué significa AdapterView <?> En el método OnitemClick ()? ¿Cuál es el uso de otros parámetros en ella?
- Cómo obtener objeto de listview en setOnItemClickListener en android?
- Cómo obtener texto de autocompletar textview android
- Spinner: obtener estado o recibir notificación cuando se abre
- Configuración de android: windowBackground a @ null hace desplazamiento a mancha?
- IsItemChecked siempre devuelve lo contrario de lo que se supone que cuando dentro de un onItemClickListener?
- Actualizar dinámicamente los tipos de vista de ListView
- No se pueden dibujar vistas secundarias en el grupo de vistas cuando se utiliza la vista del adaptador
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); }
- Cambiar el color de fondo de la barra de acción mediante AppCompat
- ¿Los gestos únicos y multi-stroke de Android en la misma biblioteca confunden el GesturesOverlayView?