Vista vacía de ListView y SwipeRefreshLayout

A veces, las cosas que deberían ser muy sencillas en Android, se complican.

Por ejemplo al utilizar SwipeRefreshLayout, que únicamente permite una vista hija dentro de su jerarquía, los problemas se reproducen como enanos. Por ejemplo al intentar utilizar el infame setEmptyView.

Finalmente, siguiendo esta pregunta de StackOverflow he optado por utilizar dos SwipeRefreshLayout, uno para el ListView y otro para la EmptyView.

El XML de layout quedaría así:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/ptr_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ListView
            android:id="@+id/lv_contents"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </android.support.v4.widget.SwipeRefreshLayout>

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@android:id/empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/empty_text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="20dp"
                android:gravity="center_horizontal"
                android:text="@string/empty_list"/>

        </ScrollView>

    </android.support.v4.widget.SwipeRefreshLayout>

</FrameLayout>

El código del controlador sería algo así:

public class SomeActivity extends AppCompatActivity {

	private ListView mListView;
	private SwipeRefreshLayout mSwipeRefreshLayout, mSwipeEmpty;

	private SwipeRefreshLayout.OnRefreshListener mRefreshListener = new SwipeRefreshLayout.OnRefreshListener() {

		@Override
		public void onRefresh() {

			//Do the refresh
		}
	};


	@Override
	public void onCreate(Bundle savedInstanceState) {


        mListView = (ListView) layout.findViewById(R.id.lv_contents);

        mSwipeEmpty = (SwipeRefreshLayout) layout.findViewById(android.R.id.empty);
		mSwipeRefreshLayout = (SwipeRefreshLayout) layout.findViewById(R.id.ptr_layout);

		configureSwipeRefreshLayout(mSwipeRefreshLayout, mRefreshListener);
		configureSwipeRefreshLayout(mSwipeEmpty, mRefreshListener);

		mListView.setEmptyView(mSwipeEmpty);
	}


	public static void configureSwipeRefreshLayout(SwipeRefreshLayout layout,
		SwipeRefreshLayout.OnRefreshListener listener) {

		layout.setOnRefreshListener(listener);
		layout.setColorSchemeResources(
		R.color.ab_swipe_color1,
		R.color.ab_swipe_color2,
		R.color.ab_swipe_color3,
		R.color.ab_swipe_color4);
	}
}

No me gusta nada tener que aplicar estas soluciones, pero a veces es lo que hay. Se agradecería una forma más elegante.

Deja un comentario

Deja un comentario