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