2016-05-12 96 views
0

我在这个片段使用下面的代码:SwipeRefreshLayout setRefreshing不显示进度条片段

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 initiallyAndroid ProgressBar styled like progress view in SwipeRefreshLayout但这些答案都不适合我。

回答

2

如果你想能够拉刷新空视图,你必须把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

编辑

如果您在滚动起来有问题,你名单。每次在该视图中向上滚动Swip​​eRefreshLayout都会触发并更新,使您的应用无法在列表中向上滚动。在您的活动或片段添加以下代码:

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

+0

作品般的魅力... !!! thnks @ mgcaguioa – Rumit