AdaptorView での setEmtpyView の正しい使用法
-
25-09-2019 - |
質問
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 を追加したレイアウトに追加する必要があります。
AdaptorView は、アダプター内の内容に基づいて可視性を変更するだけです。
編集:
次のレイアウトとコードは正常に動作します。
<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ファイルである必要はありません。私は、複数の活動のために(GridViewコントロールを含む)1つのレイアウトのXMLファイルを使用しているため、両者を分離することが有用であることが分かったが、私はそれらのそれぞれに異なる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);
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);
}
、 gridView.setEmptyView(emptyView) 呼ばれていましたが、それはemptyviewを示していません。 私はgridView.setVisibility(View.VISIBLE)と呼ばれる場合を除き、それは正常に表示されます。