Reputation: 2776
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
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
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