在AdapterView中正确使用setEmtpyView

我真的无法使用setEmptyView方法。 我试图在GridView和ListView中实现它,但他们都没有工作。 这里是一个示例代码块:

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

networking适​​配器不包含项目:

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

我也试图调用networkGames.setAdapter(null),但这也不工作。 我的emtpyView看起来像这样:

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

我真的不知道我做错了什么。 我也读了各种教程,但没有一个人遇到任何问题。

您需要在已添加AdapterView的布局中添加相同的视图。

AdapterView仅根据适配器中的内容更改其可见性。

编辑:
以下布局和代码工作正常:

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

代码:

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

卡兰的答案是现货。 AdapterView确实只是通过改变自己的可视性与空视图的可见性来显示空视图。 但是,空视图布局并不一定需要与AdapterView相同的XML文件。 我发现分开这两个是有用的,因为我使用单个布局的XML文件(包含一个GridView)的多个活动,但我想为他们每个指定不同的emptyView布局。

关键是使用addContentView将空视图添加到活动中。 请记住调用setContentView指定您的主AdapterView 执行此操作。

我的代码(在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)); 

在每个孩子的活动中,我重写getIdOfEmptyView如下:

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

您可以定义外部XML布局文件,将其充气并设置为空视图。 唯一需要记住的是设置膨胀视图的父级。

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

要么

 listView.setEmptyView(emptyView); 

PacificSky的回答几乎让我满意,但是使用addContentView将空视图添加到活动中,即使在从活动中删除包含ListView的片段之后,空视图仍然保留在活动的容器中。 此外,活动菜单中的幻灯片显示在空白视图下方或混合在一起。

我的解决scheme是将空视图添加到作为parameter passing给片段的onCreateView的容器:

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

并从片段的onDestroyView的容器中删除空视图:

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