SwipeRefreshLayout может содержать только один прямой дочерний

Я добавил «pull to refresh» в свой списокView, я также хотел добавить пустой список, когда список пуст. Теперь я получил эту ошибку. Как я могу сделать эту работу? Если im позиционирует представление за пределами swipeRefresh, а затем добавляет его как emptyView, он будет работать. Итак, как мне это сделать с внешним XML-файлом ..?

Код xml:

<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefreshLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" > <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:clipToPadding="false" android:paddingBottom="@dimen/inbox_vertical_margin" ></ListView> </android.support.v4.widget.SwipeRefreshLayout> 

onCreateView:

 View rootView = inflater.inflate(R.layout.fragment_inbox, container, false); View empty = inflater.inflate(R.layout.empty_message_list, container, false); ListView mListView = (ListView) rootView .findViewById(android.R.id.list); ((ViewGroup) mListView.getParent()).addView(empty); TextView textViewToChange = (TextView) empty .findViewById(R.id.welcomeMessage); textViewToChange.setText("YO " + ParseUser.getCurrentUser().getString( ParseConstants.KEY_PRESENTING_USERNAME) + "! bad news.. :("); mListView.setEmptyView(empty); mSwipeRefreshLayout = (SwipeRefreshLayout) rootView .findViewById(R.id.swipeRefreshLayout); mSwipeRefreshLayout.setOnRefreshListener(mOnRefreshListener); mSwipeRefreshLayout.setColorScheme(R.color.swipeRefresh1, R.color.swipeRefresh2, R.color.swipeRefresh3, R.color.swipeRefresh4); return rootView; 

SwipeRefreshLayout должен быть родительским в файле XML.

Вы можете использовать FrameLayout в качестве дочернего элемента SwipeRefreshLayout . ListView и TextView (или любое другое пустое представление состояния) могут быть дочерними представлениями FrameLayout .

Мне нужно было реализовать ту же функцию «pull to refresh» в моих приложениях. Альтернативным (и довольно простым) способом реализации «пустого представления» является использование представлений заголовка или нижнего колонтитула ListView.

Сначала вы создаете «empty_view.xml», содержащий пустой макет представления. Затем в рамках метода onCreate () вашей хостинговой деятельности сделайте что-то вроде:

 View headerView = LayoutInflater.from(this).inflate(R.layout.empty_view, myListView, false); myListView.addHeaderView(headerView); myListView.setAdapter(adapter); // populate your ListView here // ...... // now check the number of items and remove the empty view if needed if (number_of_items > 1) { myListView.removeHeaderView(headerView); } adapter.notifyDataSetChanged(); 

В приведенном выше коде myListView является объектом ListView, а адаптер – его адаптером.

Это полезно и в других ситуациях. Например, предположим, что данные списка считываются из веб-службы и медленно загружаются, тогда можно установить ProgressBar – это представление и установить его как представление заголовка ListView, чтобы пользователь имел визуальную индикацию.