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>
私は何が間違っているのか本当にわかりません。私もいろいろなチュートリアルを読みましたが、どれも問題に会いませんでした。
これと同じビューを、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を含む)を使用しているため、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;
}
外部XMLレイアウトファイルを定義し、インフレートして空のビューとして設定できます。覚えておくべきことは、インフレートされたビューの親を設定することだけです。
View emptyView = inflater.inflate(R.layout.id_of_your_layoout_file, parent, false);
gridView.setEmptyView(emptyView);
または
listView.setEmptyView(emptyView);
私の場合、gridView.setEmptyView(emptyView)が呼び出されましたが、空のビューは表示されません。 gridView.setVisibility(View.VISIBLE)を呼び出さない限り、正常に表示されます。
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);
}