Iban Arriola
Iban Arriola

Reputation: 2776

SwipeRefreshLayout setRefreshing not showing progress bar in Fragment

I am using the following code in this fragment:

public class OwnerPendingBookingsFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {

private View myView;
private ListView booking_list;
private ArrayAdapter adapter;
private SharedPreferences preferences;
private BookingList bookings;
private SwipeRefreshLayout swipe;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        myView = inflater.inflate(R.layout.owner_pending_bookings_layout, container, false);

        swipe = (SwipeRefreshLayout) myView.findViewById(R.id.swipe);
        swipe.setOnRefreshListener(this);
        swipe.post(new Runnable() {
                       @Override
                       public void run() {
                           swipe.setRefreshing(true);

                           new FindBookings().execute("");
                       }
                   }
        );

    return myView;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}


private void setUpAdapter(){
    booking_list = (ListView) myView.findViewById(R.id.pending_bookings);
    if(bookings.getBookings().size() == 0){
        booking_list.setVisibility(View.GONE);
        LinearLayout no_vehicles = (LinearLayout) myView.findViewById(R.id.no_bookings_layout);
        no_vehicles.setVisibility(View.VISIBLE);
    }else {
        new setImageTask().execute("");
        adapter = new OwnerPendingBookingsAdapter(myView.getContext(), bookings.getBookings());
        booking_list.setAdapter(adapter);
        booking_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                int booking_line = bookings.getBookings().get(position).getBooking_line_id();
                Fragment booking_info = new OwnerPendingBookingInfoFragment();
                Bundle args = new Bundle();
                args.putInt("bookingLine", booking_line);
                booking_info.setArguments(args);
                FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.content_frame, booking_info);
                transaction.addToBackStack(null);
                transaction.commit();
            }
        });
        booking_list.setVisibility(View.VISIBLE);
    }
    //LinearLayout progressBar = (LinearLayout) myView.findViewById(R.id.loadingPanel);
    //progressBar.setVisibility(View.GONE);
}

@Override
public void onRefresh() {
    swipe.setRefreshing(true);
    new FindBookings().execute("");
}

private class FindBookings extends AsyncTask<String, Void, String> {
    String token = preferences.getString(Config.TOKEN, "");


    public FindBookings() {
    }

    @Override
    protected void onPreExecute() {
        swipe.setRefreshing(true);
    }

    @Override
    protected void onPostExecute(String s){
        setUpAdapter();
        swipe.setRefreshing(false);
    }

    @Override
    protected String doInBackground(String... params) {
        bookings = DBConnect.getInfo();
        return "done";
    }
}

And I have the following layout:

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ListView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/pending_bookings"
    android:layout_gravity="center_horizontal"
    android:divider="@null"
    android:visibility="gone"/>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/no_bookings_layout">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/no_vehicles"
        android:textSize="25dp"
        android:textAlignment="center"
        />
</LinearLayout>

The first time it starts, it make it correctly I see the progress rolling until it finishes the proccess. But then everytime I swipe down it starts updating but I don't see the progress bar.

I check SwipeRefreshLayout setRefreshing() not showing indicator initially and Android ProgressBar styled like progress view in SwipeRefreshLayout but none of this answers worked for me.

Upvotes: 1

Views: 2528

Answers (2)

WebLook Services
WebLook Services

Reputation: 9

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe"
android:layout_width="match_parent"
android:layout_height="wrap_content">
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true">
            <ListView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/pending_bookings"
                android:layout_gravity="center_horizontal"
                android:divider="@null"
                android:visibility="gone"/>
            <TextView
                android:id="@+id/no_bookings_layout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="@string/no_vehicles"
                android:textSize="25dp"
                android:textAlignment="center"/>
    </FrameLayout>

It is really worked and there is nothing to be changed in Main Activity just add this framelayout and I used webview and progressbar, works fine...

Upvotes: 0

mgcaguioa
mgcaguioa

Reputation: 1493

If you want to be able to pull refresh the empty view you'll have to put the FrameLayout (that includes the ListView and the EmptyView) inside the SwipeRefreshLayout. Also, set android:clickable="true" in the FrameLayout

try this code:

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe"
android:layout_width="match_parent"
android:layout_height="wrap_content">
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true">
            <ListView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/pending_bookings"
                android:layout_gravity="center_horizontal"
                android:divider="@null"
                android:visibility="gone"/>
            <TextView
                android:id="@+id/no_bookings_layout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="@string/no_vehicles"
                android:textSize="25dp"
                android:textAlignment="center"/>
    </FrameLayout>

credit to antoinem

EDIT

In case you have problem in scrolling up your list. That everytime you scroll up in that view SwipeRefreshLayout fires and updates, making your app unable to scroll up in a list. Add this code in your Activity or fragment:

listView.setOnScrollListener(new AbsListView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                             int visibleItemCount, int totalItemCount) {
            int topRowVerticalPosition = (listView == null ||
                    listView.getChildCount() == 0) ? 0 : listView.getChildAt(0).getTop();
            swipeRefreshLayout.setEnabled(firstVisibleItem == 0 && topRowVerticalPosition >= 0);
        }
    });

credit to this post by Nacho Lopez

Upvotes: 3

Related Questions