39 votes

Utilisation correcte de setEmtpyView dans AdapterView

Je suis vraiment à avoir de la difficulté à utiliser le setEmptyView méthode. J'ai essayé de la mettre en œuvre GridView et ListView, mais deux d'entre eux n'ont pas fonctionné. Ici un exemple de codeblock:

 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());

La carte réseau contient pas d'éléments:

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;
        }

    }

J'ai aussi essayé d'appeler networkGames.setAdapter(null), mais cela ne fonctionne pas non plus. Mon emtpyView ressemble à ceci:

<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>

Je ne sais vraiment pas ce que je fais mal. J'ai aussi lu plusieurs tutoriels, mais aucun d'entre eux metnioned tous les problèmes.

94voto

Karan Points 6418

Vous devez ajouter cette même vue dans la mise en page dans laquelle vous avez ajouté AdapterView.

AdapterView modifie uniquement sa visibilité en fonction du contenu de l'adaptateur.

Édité:
Suivre la disposition et le code fonctionne 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> 

Code:

 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() ) ); 

20voto

PacificSky Points 1469

Karan réponse est sur place. L'AdapterView en effet affiche la vue vide simplement en changeant sa propre visibilité vs le vide de la vue de la visibilité. Cependant, le vide de la vue de mise en page n'a pas nécessairement besoin d'être dans le même fichier XML, comme celle de l'AdapterView. Je l'ai trouvé utile de séparer les deux, parce que j'utilise une mise en page unique fichier XML (contenant un GridView) pour de multiples activités, mais je voulais spécifier différents emptyView dispositions pour chacun d'entre eux.

La clé est d'ajouter le vide de vue de l'activité avec addContentView. N'oubliez pas de le faire après que vous avez appelé setContentView précisant vos principales AdapterView.

Mon code (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));

Dans chaque activité enfant je remplace getIdOfEmptyView comme suit:

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

2voto

skpal202 Points 495

Vous pouvez définir des fichiers de présentation XML externes, les gonfler et les définir comme une vue vide. La seule chose à retenir est de définir le parent de la vue gonflée.

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

ou

 listView.setEmptyView(emptyView);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X