Uso correto do setemtpyView no AdaptView
-
25-09-2019 - |
Pergunta
Estou realmente tendo problemas para usar o método SetEmptyView. Eu tentei implementá -lo no GridView e na ListView, mas os dois não funcionaram. Aqui um exemplo de código de código:
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());
O adaptador de rede não contém itens:
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;
}
}
Eu também tentei ligar para o NetworkGames.setAdapter (NULL), mas isso também não funciona. Meu Emtpyview se parece com o seguinte:
<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>
Eu realmente não sei o que estou fazendo de errado. Também li vários tutoriais, mas nenhum deles encontrou problemas.
Solução
Você precisa adicionar a mesma visualização no layout em que adicionou o adaptador.
O adaptador altera apenas sua visibilidade com base no conteúdo do adaptador.
Editado:
A seguir, o layout e o código funcionam bem:
<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>
Código:
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() ) );
Outras dicas
A resposta de Karan é spot-on. O AdaptView realmente exibe a visão vazia apenas mudando sua própria visibilidade versus a visibilidade da visão vazia. No entanto, o layout de visualização vazio não precisa necessariamente estar no mesmo arquivo XML que o do AdaptView. Achei útil separar os dois porque uso um único arquivo XML de layout (contendo uma GridView) para várias atividades, mas queria especificar diferentes layouts em vazio para cada um deles.
A chave é adicionar a visualização vazia à atividade com AddContentView. Lembre -se de fazer isso depois Você ligou para o setContentView especificando seu adaptador principal.
Meu código (em abstrateBaseActivity.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));
Em cada atividade infantil, substituo o GetidoFeptyView da seguinte maneira:
@Override
protected int getIdOfEmptyView()
{
return R.layout.emptyView_Favorites;
}
Você pode definir arquivos de layout XML externos, inflar e defini -los como uma visualização vazia. A única coisa a lembrar é definir o pai da visão inflada.
View emptyView = inflater.inflate(R.layout.id_of_your_layoout_file, parent, false);
gridView.setEmptyView(emptyView);
ou
listView.setEmptyView(emptyView);
A resposta do Pacificsky me levou quase ao que eu precisava, mas adicionando a visão vazia à atividade com addContentView
fez com que a visão vazia permanecesse no contêiner da atividade, mesmo após a remoção do fragmento que contém a ListView da atividade. Além disso, o slide no menu da atividade exibido ou misturado com a visualização vazia.
A solução para mim foi adicionar a visão vazia ao recipiente passado como um parâmetro para o fragmento 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);
E remova a vista vazia do recipiente no fragmento onDestroyView
:
@Override
public void onDestroyView(){
super.onDestroyView();
mFragmentContainer.removeView(mEmptyListView);
}
Para o meu caso, GridView.SetEmptyView (EmptyView) foi chamado, mas não é mostrado o vazio. A menos que eu tenha chamado GridView.Setvisibility (View.Visible), ele parece normalmente;