/ / SwipeRefreshLayout puede alojar solo un hijo directo: Android, XML, setcontentview

SwipeRefreshLayout puede alojar solo un hijo directo: Android, XML, setcontentview

He añadido un "tirón para actualizar" a mi listView, iTambién quería agregar una vista vacía cuando la lista está vacía. Ahora recibí este error. ¿Cómo puedo hacer que esto funcione? Si estoy posicionando una vista fuera de swipeRefresh y luego agréguela como la vista vacía funcionará. Entonces, ¿cómo puedo hacerlo con un archivo xml externo ...?

El código 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;

Respuestas

15 para la respuesta № 1

SwipeRefreshLayout Debería ser el padre en el archivo XML.

Puedes usar un FrameLayout como el niño de SwipeRefreshLayout. los ListView y TextView (o cualquier otra vista de estado vacía) pueden ser vistas secundarias de FrameLayout.


0 para la respuesta № 2

Necesitaba implementar la misma función de "extracción para actualizar" en mis aplicaciones. Una forma alternativa (y bastante simple) de implementar la "vista vacía" es usar las vistas de encabezado o pie de página de ListView.

Primero creas un "empty_view.xml" que contiene el diseño de vista vacío. Luego, dentro del método onCreate () de su actividad de hosting, haga algo como:

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

En el codigo anterior myListView es el objeto ListView y adaptador Es su adaptador.

Esto es útil en otras situaciones también. Por ejemplo, supongamos que los datos de la lista se leen desde un servicio web y se cargan lentamente, luego se puede colocar una Barra de progreso en una vista y establecerla como la vista de encabezado de ListView para que el usuario tenga alguna indicación visual.