SwipeRefreshLayout может содержать только один прямой дочерний элемент
Я добавил "pull to refresh" в свой listView, я также хотел добавить пустое представление, когда список пуст - теперь я получил эту ошибку. Как я могу сделать эту работу? если я позиционирую представление вне 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;
2 ответа
SwipeRefreshLayout
должен быть родителем в файле XML.
Вы можете использовать FrameLayout
как дитя SwipeRefreshLayout
, ListView
а также TextView
(или любое другое пустое представление состояния) может быть дочерним представлением FrameLayout
,
Мне нужно было реализовать ту же функцию "тянуть, чтобы обновить" в моих приложениях. Альтернативный (и довольно простой) способ реализации "пустого представления" заключается в использовании представлений 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, чтобы у пользователя была некоторая визуальная индикация.