SwipeRefreshLayout setRefreshing 在 Fragment 中不显示进度条

SwipeRefreshLayout setRefreshing not showing progress bar in 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";
    }
}

我有以下布局:

<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>

第一次启动时,它正确地显示了进度,直到它完成该过程。但是每次我向下滑动它都会开始更新,但我看不到进度条。

我检查了 SwipeRefreshLayout setRefreshing() not showing indicator initially and ,但是 none 这个答案对我有用。

如果您希望能够拉动刷新空视图,您必须将 FrameLayout(包括 ListView 和 EmptyView)放在 SwipeRefreshLayout。另外,在FrameLayout

中设置android:clickable="true"

试试这个代码:

<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>

归功于 antoinem

编辑

如果您在向上滚动列表时遇到问题。每次您在该视图中向上滚动时,SwipeRefreshLayout 都会触发并更新,从而使您的应用无法在列表中向上滚动。在您的 Activity 或片段中添加此代码:

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

归功于 this post by Nacho Lopez

<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>

它真的很有效,在 Main 中没有什么可以改变的 Activity 只需添加这个 framelayout 并且我使用了 webview 和 progressbar,工作正常...