web-dev-qa-db-fra.com

Utilisation correcte de setEmtpyView dans AdapterView

J'ai vraiment du mal à utiliser la méthode setEmptyView. Je l'ai essayé pour l'implémenter dans GridView et ListView, mais les deux n'ont pas fonctionné. Voici 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 ne contient aucun élément:

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 également 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 divers tutoriels, mais aucun d'entre eux n'a posé de problème.

38

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é:  
La mise en page et le code suivants fonctionnent 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() ) );

93
Karan

La réponse de Karan est parfaite. AdapterView affiche en effet la vue vide en modifiant simplement sa propre visibilité par rapport à la visibilité de la vue vide. Toutefois, la présentation de vue vide ne doit pas nécessairement figurer dans le même fichier XML que celui de AdapterView. J'ai trouvé utile de séparer les deux parce que j'utilise un seul fichier XML de présentation (contenant un GridView) pour plusieurs activités, mais je souhaitais spécifier différentes dispositions emptyView pour chacune d'elles.

La clé consiste à ajouter la vue vide à l'activité avec addContentView. N'oubliez pas de faire ceci après vous avez appelé setContentView en spécifiant votre principal adaptateur.

Mon code (dans 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;
}
20
PacificSky

Vous pouvez définir des fichiers de présentation XML externes, les gonfler et les définir en tant que vues vides ..___ 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);
2
skpal202

Pour mon cas, GridView.setEmptyView (emptyView) A été appelé mais ne montre pas la emptyview . À moins que je n’aie appelé gridView.setVisibility (View.VISIBLE), il apparaît donc normalement;

0
ratanak pek

La réponse de PacificSky me donnait presque ce dont j'avais besoin, mais l'ajout de la vue vide à l'activité avec addContentView faisait que la vue vide restait dans le conteneur de l'activité, même après avoir supprimé le fragment contenant la liste. De plus, la diapositive dans le menu pour l'activité affichée est sous ou mélangée avec la vue vide.

La solution pour moi était d'ajouter la vue vide au conteneur transmis en tant que paramètre à la variable onCreateView du fragment:

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

Et supprimez la vue vide du conteneur dans la variable onDestroyView du fragment:

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