Правильное использование setEmtpyView в AdapterView - PullRequest
38 голосов
/ 11 мая 2010

У меня действительно проблемы с использованием метода 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>

Я действительно не знаю, что я делаю неправильно. Я также читал различные учебные пособия, но ни один из них не имел проблем.

Ответы [ 5 ]

93 голосов
/ 11 мая 2010

Вам необходимо добавить этот же вид в макет, в который вы добавили 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() ) );
20 голосов
/ 19 марта 2012

Ответ Карана точный. AdapterView действительно отображает пустое представление, просто изменяя свою собственную видимость по сравнению с видимостью пустого представления. Однако пустой макет представления не обязательно должен находиться в том же XML-файле, что и AdapterView. Я нашел полезным разделить их, потому что я использую один файл 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;
}
2 голосов
/ 17 октября 2012

Вы можете определять внешние файлы макета XML, раздувать и устанавливать его как пустое представление. Единственное, что нужно помнить, это установить родителя завышенного представления.

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

или

listView.setEmptyView(emptyView);
0 голосов
/ 16 января 2019

Для моего случая gridView.setEmptyView (emptyView) был вызван, но это не показывает пустой вид. Если только я не вызвал gridView.setVisibility (View.VISIBLE), он выглядит нормально;

0 голосов
/ 29 августа 2015

Ответ 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);
}
...