Question

Je suis vraiment des difficultés à utiliser la méthode setEmptyView. Je l'ai essayé de le mettre en œuvre dans GridView et ListView, mais les deux ne fonctionnait pas. Voici un échantillon 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());

L'adaptateur réseau 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 aussi essayé d'appeler networkGames.setAdapter (null), mais ce travail ne marche 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. Je lis aussi divers tutoriels, mais aucun d'entre eux metnioned aucun problème.

Était-ce utile?

La solution

Vous devez ajouter ce même point de vue dans la mise en page dans laquelle vous avez ajouté le AdapterView.

AdapterView ne change sa visibilité en fonction du contenu de l'adaptateur.

ÉDITÉ: Suite à la mise en page et le code fonctionne très 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() ) );

Autres conseils

La réponse de Karan est sur place. Le AdapterView affiche en effet la vue vide en changeant simplement sa propre visibilité par rapport la visibilité de la vue vide. Cependant, la mise en page de vue vide ne doit pas nécessairement être dans le même fichier XML que celui de la AdapterView. Je l'ai trouvé utile de séparer les deux parce que j'utilise un fichier XML unique de mise en page (contenant un GridView) pour de multiples activités, mais je voulais préciser différentes dispositions de emptyView pour chacun d'eux.

La clé est d'ajouter la vue vide à l'activité avec addContentView. Rappelez-vous de le faire après que vous avez appelé setContentView précisant votre AdapterView principal.

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é de l'enfant que j'Override getIdOfEmptyView comme suit:

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

Vous pouvez définir des fichiers de mise en page XML externes, gonfler et le définir comme une vue vide. La seule chose à retenir est de mettre le parent de la vue gonflé.

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

ou

listView.setEmptyView(emptyView);

La réponse de PacificSky m'a presque ce que je avais besoin, mais en ajoutant le point de vue vide à l'activité avec addContentView fait le point de vue vide de rester dans le conteneur de l'activité même après avoir retiré le fragment contenant le ListView de l'activité. En outre, la diapositive dans le menu de l'activité affichée sous ou mélangé avec la vue vide.

La solution pour moi était d'ajouter la vue vide au conteneur passé en paramètre à la 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 retirez la vue vide du récipient dans le onDestroyView du fragment:

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

Pour mon cas, gridView.setEmptyView (emptyView) a été appelé mais il montre pas le emptyview. À moins que j'ai appelé gridView.setVisibility (View.VISIBLE), il apparaît normalement;

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top