Mam Fragment
z SwipeRefreshLayout
, a następnie RecyclerView
jako dziecko. Po zatwierdzeniu fragmentu rozpoczyna on rozmowę z serwerem w celu pobrania niektórych danych i wypełnienia niestandardowego kontrolera, który będzie obsługiwał widok RecyclerView.SwipeRefreshLayout jest ukryty na pustym RecyclerView
Użytkownik może odświeżyć zawartość, przesuwając palcem w dół lub naciskając przycisk na pasku akcji. W tym ostatnim przypadku ręcznie wywołuję swipeRefreshLayout.setRefreshing(true)
. Więc do tej pory nie ma problemów.
Problem pojawia się, gdy ręcznie wywołuję stan odświeżania podczas pierwszego ładowania urządzenia RecyclerView (onStart()
). Wskaźnik postępu nie jest wyświetlany i zakładam, że widok RecyclerView jest nadal pusty, ponieważ pobranie niektórych danych zajmuje kilka sekund ...
Zostawiam ci trochę kodu.
fragment kodu: Kod
public class MyFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View mView = inflater.inflate(R.layout.fragment_stop, container, false);
mRecyclerView = (RecyclerView) mView.findViewById(R.id.recyclerView1);
mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),
DividerItemDecoration.VERTICAL_LIST));
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//SwipeRefreshLayout retrieved and configured
swipeLayout = (SwipeRefreshLayout) mView.findViewById(R.id.swipe_container);
swipeLayout.setOnRefreshListener(this);
swipeLayout.setColorSchemeResources(
R.color.primaryColor,
R.color.cyan_500,
R.color.light_green_500,
R.color.amber_500);
return mView;
}
...
@Override
public void onStart() {
super.onStart();
executeSchedule(); //First execution and data loading.
}
...
@Override
public void onRefresh() {
executeSchedule();
}
...
public void executeSchedule() {
new Schedule().execute();
}
private class Schedule extends AsyncTask<Void, Void, Void> {
...
@Override
protected void onPreExecute() {
super.onPreExecute();
if(!swipeLayout.isRefreshing()) {
swipeLayout.setRefreshing(true); //set refresh state
}
}
@Override
protected Void doInBackground(Void... params) {
...
}
@Override
protected void onPostExecute(Void result) {
adap = new CustomAdapter(getActivity(), ...);
mRecyclerView.setAdapter(adap);
swipeLayout.setRefreshing(false);
}
}
XML:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/section_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:paddingBottom="2dp"
android:layout_marginTop="5dp"
android:divider="#e0e0e0"
tools:context=".MyFragment" />
</android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>
</FrameLayout>
Co byłoby najlepsze praktyki w celu rozwiązania tej sytuacji? Dodawanie drugiej sztuczki SwipeRefreshLayout? Natychmiast wymusić pusty adapter?
Dziękuję. Nie wiedziałem o tym. Na pewno jest to o wiele lepsze rozwiązanie niż wywołanie 'setProgressViewOffset()' – Emanuele