Evitar warning Nullable en findViewById (Android 23)

Si utilizas appcompat 23.3.0 han añadido la anotación @Nullable al método findViewById en AppCompatActivity y también en el framework base. Lo cual es muy molesto, ya que provoca que el código de las actividades aparezca lleno de warnings.

Mientras llega la solución utilizo esta “chapuzilla”:

public class BaseActivity extends AppCompatActivity {
    @NonNull
    @Override
    public View findViewById(@IdRes int id) {
        //noinspection ConstantConditions
        return super.findViewById(id);
    }
}

Actualización: Con las nuevas versiones de Android (24 en adelante), ya no es necesario hacer esto.

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.