SwipeRefreshLayout can host only one direct child

寵の児 提交于 2020-01-11 08:11:18

问题


I added a "pull to refresh" to my listView, i also wanted to add an empty view when the list is empty - Now i got this error. How can i make this work? if im positioning a view outside of the swipeRefresh and then add it as the emptyView it will work. So how do i so it with an outer xml file .. ?

The xml code:

        <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;

回答1:


SwipeRefreshLayout should be the parent in the XML file.

You can use a FrameLayout as the child of SwipeRefreshLayout. The ListView and TextView (or any other empty state view) can be child views of the FrameLayout.




回答2:


I needed to implement the same "pull to refresh" feature in my Apps. An alternative (and quite simple) way to implement the 'empty view' is to use the ListView's header or footer views.

First you create an "empty_view.xml" containing the empty view layout. Then within the onCreate() method of your hosting activity, do something like:

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();

In the above code myListView is the ListView object and adapter is its adapter.

This is useful in other situations too. For example, assume the list data is read from a web service and is slow to load, then one can put a ProgressBar is a view and set it as the ListView's header view so that user has some visual indication.



来源:https://stackoverflow.com/questions/23830594/swiperefreshlayout-can-host-only-one-direct-child

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!