Pregunta

Estoy realmente tiene problemas para usar el método setEmptyView. Yo probé a ponerlo en práctica en GridView y ListView, pero ambos no funcionó. Aquí un bloque de 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 elementos:

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 networkGames.setAdapter (nulo), pero esto no funciona bien. Mis emtpyView es similar al siguiente:

<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 metnioned ningún problema.

¿Fue útil?

Solución

Es necesario añadir este mismo punto de vista en la disposición en la que ha añadido la AdapterView.

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

Editado:
Siguiendo el diseño y el código funciona 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() ) );

Otros consejos

La respuesta de Karan es el clavo. El hecho AdapterView 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 ser en el mismo archivo XML como el de la AdapterView. He encontrado que es útil para separar los dos, porque yo uso un solo archivo del formato XML (que contiene un GridView) para múltiples actividades, pero quería especificar diferentes diseños emptyView para cada uno de ellos.

La clave es añadir la vista de vacío a la actividad con addContentView. Recuerda hacer esto después que han llamado 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 niño I anular getIdOfEmptyView como sigue:

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

Se pueden definir archivos de diseño XML externos, inflar y configurarlo como una vista vacía. Lo único que hay que recordar es establecer la matriz de la visión exagerada.

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 la adición de la opinión de vacío a la actividad con addContentView causó la vista vacía para permanecer en el recipiente de la actividad incluso después de retirar el fragmento que contiene el ListView de la actividad. Además, la diapositiva en el menú para la actividad muestra bajo o mezclados con la vista vacía.

La solución para mí fue añadir la vista vacío al recipiente pasado como un parámetro para 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 desde el recipiente en onDestroyView del fragmento:

@Override
public void onDestroyView(){
    super.onDestroyView();
    mFragmentContainer.removeView(mEmptyListView);
}

En mi caso, gridView.setEmptyView (emptyView) se llamaba pero no se muestra la emptyview. A menos que se llama gridView.setVisibility (View.VISIBLE), por lo que normalmente aparecen;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top