38

我真的在使用 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());

网络适​​配器不包含任何项目:

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>

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

4

5 回答 5

93

您需要在添加了 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() ) );

于 2010-05-11T04:25:09.213 回答
20

卡兰的回答很到位。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;
}
于 2012-03-19T18:08:48.907 回答
2

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

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

或者

listView.setEmptyView(emptyView);
于 2012-10-16T20:56:43.490 回答
0

PacificSky 的回答让我几乎得到了我需要的东西,但是将空视图添加到活动中会addContentView导致空视图保留在活动的容器中,即使在从活动中删除包含 ListView 的片段之后也是如此。此外,活动的滑动菜单显示在空视图下或与空视图混合。

我的解决方案是将空视图添加到作为参数传入片段的容器中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);
}
于 2015-08-29T00:40:30.063 回答
0

就我而言,调用了 gridView.setEmptyView(emptyView) 但它没有显示空视图。除非我调用了gridView.setVisibility(View.VISIBLE),所以它正常显示;

于 2019-01-16T08:18:11.783 回答