2014-10-28 27 views
18

Tôi trước đây đã sử dụng API 19 và đang sử dụng SwipeRefreshLayout cho nhiều phần của tôi. Khi tôi tải nội dung lần đầu tiên trước đây, tôi đã sử dụng setRefreshing(true); và có thể tải nội dung và nó hoạt động tốt.SwipeRefreshLayout trong API 21

Tôi nhận thấy trong Android 5.0 Google đang sử dụng chế độ xem hình tròn. Khi tôi gọi setRefreshing(true); bây giờ nó chỉ đơn giản là không có hiệu lực. Có cách nào để lập trình trình quay mới không? Tôi đã nghiên cứu kỹ về điều này một chút nhưng không thể hiển thị nó theo chương trình. Tôi đã đọc những điều sau đây về vấn đề này:

http://developer.android.com/tools/support-library/index.html

https://yassirh.com/2014/05/how-to-use-swiperefreshlayout-the-right-way/

SwipeRefreshLayout doesn't show any indicator of refreshing

Về cơ bản, nó cho thấy không có dấu hiệu cho thấy sảng khoái lần thử đầu tiên.

Trả lời

30

Thay vì trực tiếp thiết

getSwipeRefreshLayout().setRefreshing(true); 

bạn có thể trì hoãn nó trên thread UI cho sau này

getSwipeRefreshLayout().post(new Runnable() { 
    @Override public void run() { 
     getSwipeRefreshLayout().setRefreshing(true); 
    } 
}); 

làm việc này một cách hoàn hảo cho tôi để bắt đầu tải trong onCreateView và nếu được thực hiện trong một LoaderManager.LoaderCallbacks quá.

Tôi đã không nhìn thấy thanh tiến trình vô tình dính (vì tải dữ liệu là quá nhanh), nhưng nếu bạn nghi ngờ rằng tải trọng có thể trở lại quá sớm (lỗi?) nó có giá trị để làm điều tương tự đăng cho

getSwipeRefreshLayout().setRefreshing(false); 

theo cách này, hai post s chắc chắn sẽ đến sau cái kia, dẫn đến một chế độ xem tiến độ ẩn chắc chắn.

+0

IMO giải pháp này tốt hơn nhiều so với chấp nhận –

+1

Vui lòng đánh dấu vấn đề sau nếu bạn gặp sự cố này: https: // code.google.com/p/android/issues/detail?id=77712 – TWiStErRob

1

Đây không phải là giải pháp rất sạch sẽ, nhưng nó hoạt động ngay bây giờ. setRefreshing(boolean) chế độ xem tiến trình nằm phía sau thanh tác vụ. Giải pháp là đẩy nó xuống:

Display display = getActivity().getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    int height = size.y; 
    getSwipeRefreshLayout().setProgressViewOffset(false, -200, height/9); 

Nếu bạn có giải pháp tốt hơn, vui lòng gửi nó bên dưới và tôi sẽ chấp nhận nó!

Vui lòng không sử dụng giải pháp này, câu trả lời được chấp nhận sẽ tốt hơn.

+0

Đây là thảm họa. Có nhiều cách tốt hơn để thực sự sửa lỗi này thay vì hack các thứ lại với nhau. Đã bỏ phiếu. –

+0

Tôi chấp nhận câu trả lời khác vì một lý do. – KVISH

+0

Vui lòng đọc câu hỏi và khi tôi đăng câu trả lời của mình. Vào thời điểm đó, 'SwipeRefreshLayout' là thương hiệu mới và không có giải pháp tốt cho việc này. – KVISH

0

Tôi gặp phải vấn đề tương tự, nhưng chỉ trong trường hợp sử dụng StickyListHeadersListView. Sử dụng android.widget.ListView, mọi thứ đều OK.

Tôi nghĩ rằng trong api 21, Google đã viết lại lớp listview. Nếu bạn đang sử dụng listview lớp con, tôi đoán rằng bạn có thể cần phải thực hiện các subclass exends android.widget.ListView trong api 21.

+0

Thats rất lạ. Tôi đang sử dụng 'android.widget.ListView' hoặc phân lớp của nó ở mọi nơi ... – KVISH

0

Những gì bạn cần phải nhớ là Thiết kế material design SwipeRefreshLayout đã thay đổi, trong khi cái cũ sử dụng BakedBezierInterpolator, nhưng cái mới sử dụng tiến trình "kéo vào vị trí" spinner

Thật không may API 21 không bao gồm BakedBezierInterpolator nữa, do đó, theo quan điểm của tôi, bạn có 2 tùy chọn: 1) chuyển spinner xuống (và nhớ để chuyển nó trở lại sau đó) 2) làm cho spinner của riêng bạn để ngồi trên màn hình khi bạn đang tải ban đầu dữ liệu

Nếu bạn muốn giữ spinner của bạn giống nhau, sau đó chắc chắn sử dụng SwipeRefreshLayout, nhưng hãy chắc chắn rằng bạn nhớ lại vị trí của nó

tôi hy vọng điều này sẽ giúp một cách nào đó ...

Các vấn đề liên quan