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 は、アダプターの内容に基づいて可視性のみを変更します。

EDITED:
次のレイアウトとコードは正常に動作します:


<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ファイルである必要はありません。複数のアクティビティに単一のレイアウトXMLファイル(GridViewを含む)を使用するため、2つを分離すると便利ですが、それぞれに異なるemptyViewレイアウトを指定したいと思いました。

重要なのは、addContentViewを使用して空のビューをアクティビティに追加することです。メインのAdapterViewを指定してsetContentViewを呼び出した後、これを行うことを忘れないでください。

私のコード(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 に答える