Saya telah menerapkan SwipeRefreshLayout
dan ViewPager
di aplikasi saya, tetapi ada masalah besar: kapan pun saya akan menggeser ke kiri / kanan untuk beralih antar halaman, pengguliran terlalu sensitif. Sedikit gesekan ke bawah akan memicu SwipeRefreshLayout
penyegaran juga.
Saya ingin menetapkan batas kapan gesekan horizontal dimulai, lalu paksa horizontal hanya sampai gesekan selesai. Dengan kata lain, saya ingin membatalkan gesekan vertikal saat jari bergerak secara horizontal.
Masalah ini hanya terjadi pada ViewPager
, jika saya menggesek ke bawah dan SwipeRefreshLayout
fungsi refresh dipicu (bilah ditampilkan) dan kemudian saya menggerakkan jari saya secara horizontal, itu masih hanya memungkinkan gesekan vertikal.
Saya sudah mencoba untuk memperluas ViewPager
kelas tetapi tidak berhasil sama sekali:
public class CustomViewPager extends ViewPager {
public CustomViewPager(Context ctx, AttributeSet attrs) {
super(ctx, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean in = super.onInterceptTouchEvent(ev);
if (in) {
getParent().requestDisallowInterceptTouchEvent(true);
this.requestDisallowInterceptTouchEvent(true);
}
return false;
}
}
Tata letak xml:
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/viewTopic"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.myapp.listloader.foundation.CustomViewPager
android:id="@+id/topicViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.v4.widget.SwipeRefreshLayout>
bantuan apa pun akan dihargai, terima kasih
sumber
SwipeRefreshLayout
?Jawaban:
Saya tidak yakin apakah Anda masih memiliki masalah ini tetapi aplikasi Google I / O iosched menyelesaikan masalah ini dengan demikian:
Saya telah menggunakan yang sama dan bekerja dengan cukup baik.
EDIT: Gunakan addOnPageChangeListener () sebagai ganti setOnPageChangeListener ().
sumber
Dipecahkan dengan sangat sederhana tanpa memperpanjang apa pun
bekerja seperti pesona
sumber
View
bahwa Anda mungkin memiliki di dalamViewPager
, sebagaiSwipeRefreshLayout
memungkinkan bergulir bahkan vertikal hanya untuk itu anak tingkat atas (dan API lebih rendah dari ICS hanya jika hal itu terjadi untuk menjadiListView
) .ViewPager
bagian dalamSwipeRefrestLayout
dan ViewPager memilikiListview
!SwipeRefreshLayout
biarkan saya menggulir ke bawah tetapi saat menggulir ke atas itu memicu kemajuan penyegaran. Ada saran?Saya telah menemui masalah Anda. Sesuaikan SwipeRefreshLayout akan menyelesaikan masalah.
Lihat ref: link
sumber
Saya mendasarkan ini dari jawaban sebelumnya tetapi menemukan ini bekerja sedikit lebih baik. Mosi dimulai dengan acara ACTION_MOVE dan diakhiri dengan ACTION_UP atau ACTION_CANCEL menurut pengalaman saya.
sumber
Untuk beberapa alasan yang paling hanya diketahui oleh mereka, tim pengembang pustaka dukungan merasa cocok untuk secara paksa mencegat semua peristiwa gerakan tarik vertikal dari
SwipeRefreshLayout
tata letak anak, bahkan ketika seorang anak secara khusus meminta kepemilikan acara tersebut. Satu-satunya hal yang mereka periksa adalah bahwa status gulir vertikal dari turunan utamanya berada di nol (dalam kasus anak itu dapat digulir secara vertikal). TherequestDisallowInterceptTouchEvent()
Metode telah ditimpa dengan tubuh kosong, dan (tidak begitu) menerangi komentar "Tidak".Cara termudah untuk mengatasi masalah ini adalah dengan menyalin kelas dari pustaka dukungan ke dalam proyek Anda dan menghapus penggantian metode.
ViewGroup
Implementasi menggunakan status internal untuk penanganannyaonInterceptTouchEvent()
, jadi Anda tidak bisa begitu saja mengganti metode itu lagi dan menduplikasinya. Jika Anda benar-benar ingin mengganti implementasi support library, Anda harus menyiapkan flag kustom saat panggilan kerequestDisallowInterceptTouchEvent()
, dan menggantionInterceptTouchEvent()
danonTouchEvent()
(atau mungkin meretascanChildScrollUp()
) perilaku berdasarkan itu.sumber
Saya telah menemukan solusi untuk ViewPager2. Saya menggunakan refleksi untuk mengurangi sensitivitas drag seperti ini:
Ini bekerja seperti pesona bagi saya.
sumber
Ada satu masalah dengan solusi nhasan:
Jika gesekan horizontal yang memicu
setEnabled(false)
panggilan diSwipeRefreshLayout
dalamOnPageChangeListener
terjadi saatSwipeRefreshLayout
telah mengenali Tarik-untuk-Muat Ulang tetapi belum memanggil callback notifikasi, animasi menghilang tetapi status internalSwipeRefreshLayout
tetap "menyegarkan" selamanya karena tidak panggilan balik notifikasi yang dapat mengatur ulang status. Dari sudut pandang pengguna, ini berarti Tarik-untuk-Muat Ulang tidak berfungsi lagi karena semua gerakan tarik tidak dikenali.Masalahnya di sini adalah bahwa
disable(false)
panggilan tersebut menghapus animasi spinner dan callback notifikasi dipanggil darionAnimationEnd
metode AnimationListener internal untuk spinner tersebut yang disetel tidak berurutan seperti itu.Memang perlu penguji kami dengan jari tercepat untuk memprovokasi situasi ini, tetapi itu dapat terjadi sesekali dalam skenario realistis juga.
Solusi untuk memperbaikinya adalah dengan mengganti
onInterceptTouchEvent
metodeSwipeRefreshLayout
sebagai berikut:Gunakan
MySwipeRefreshLayout
di Layout Anda - File dan ubah kode dalam solusi mhasan menjadisumber
Mungkin ada masalah dengan jawaban @huu duy saat ViewPager ditempatkan dalam wadah yang dapat di-scroll secara vertikal yang, pada gilirannya, ditempatkan di SwiprRefreshLayout Jika wadah konten yang dapat digulir tidak sepenuhnya di-scroll, maka itu mungkin tidak memungkinkan untuk aktifkan swipe-to-refresh dengan gerakan scroll-up yang sama. Memang, ketika Anda mulai menggulir wadah dalam dan menggerakkan jari secara horizontal lebih dari mTouchSlop secara tidak sengaja (yang merupakan 8dp secara default), CustomSwipeToRefresh yang diusulkan menolak gerakan ini. Jadi, pengguna harus mencoba sekali lagi untuk mulai menyegarkan. Ini mungkin terlihat aneh bagi pengguna. Saya mengekstrak kode sumber untuk SwipeRefreshLayout asli dari pustaka dukungan ke proyek saya dan menulis ulang onInterceptTouchEvent ().
Lihat proyek contoh saya di Github .
sumber