Tüm ekranı doldurmayan 2 öğeyle bir RecyclerView var. Kullanıcının RecyclerView'ın boş kısmına tıkladığını nasıl algılayabilirim (anlamı doğrudan RecyclerView’a tıklanmış ve öğelerinden biri değil)?Tespit Etme Geri Dönüşüm öğeleri öğelerin dışında
cevap
Bunu yapmak için RecyclerView
alt sınıfını ve dispatchTouchEvent()
yöntemini geçersiz kılabilirsiniz. findChildViewUnder()
yöntemini kullanarak, çocuk Görünümlerinin dışında bir dokunma olayı olup olmadığını belirleyebilir ve eğer varsa bir dinleyiciye bildirmek için bir interface
kullanın. Aşağıdaki örnekte, OnNoChildClickListener
interface
, bu işlevselliği sağlar.
public class TouchyRecyclerView extends RecyclerView
{
// Depending on how you're creating this View,
// you might need to specify additional constructors.
public TouchyRecyclerView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
private OnNoChildClickListener listener;
public interface OnNoChildClickListener
{
public void onNoChildClick();
}
public void setOnNoChildClickListener(OnNoChildClickListener listener)
{
this.listener = listener;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event)
{
// The findChildViewUnder() method returns null if the touch event
// occurs outside of a child View.
// Change the MotionEvent action as needed. Here we use ACTION_DOWN
// as a simple, naive indication of a click.
if (event.getAction() == MotionEvent.ACTION_DOWN
&& findChildViewUnder(event.getX(), event.getY()) == null)
{
if (listener != null)
{
listener.onNoChildClick();
}
}
return super.dispatchTouchEvent(event);
}
}
Not: Bu my answer hereGridView
ilişkin gelen RecyclerView
için uyarlanmıştır. Yorumlarınız
mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
if (motionEvent.getAction() != MotionEvent.ACTION_UP) {
return false;
}
View child = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY());
if (child != null) {
// tapped on child
return false;
} else {
// Tap occured outside all child-views.
// do something
return true;
}
}
@Override
public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
}
});
sadece bir TouchListener
ayarlamanız gerekir RecyclerView
gibi yukarıda gösterilen:
categoryTable.setAdapter(new CatgoriesAdapter(categories.getWrappedList()));
categoryTable.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN
&& categoryTable.findChildViewUnder(event.getX(), event.getY()) == null)
{
// Touch outside items here, you do whatever you want
HideCategoryMenu();
}
return false;
}
});
Ayrıca MotionEvent.getAction() == ACTION_UP seçeneğini de işaretlemelisiniz, aksi takdirde 2 tıklama olayı gerçekleşir. –
Teşekkürler @ greg-ennis. Kodu güncelledim. –
Bu kabul edilen cevap olmalı. Ayrıca, 'MotionEvent.ACTION_UP' bölümünün altında 'dönüş' yerine 'geri dönüş' olmalıdır. –
belirtildiği gibi
driss-Bounouar cevabı neredeyse bu önleyecektir sağ rağmen @ Kullanıcı, geri dönüştürücü görünümünü aşağıdan aşağıya kaydırırken, işleminizin gerçekleşmesine neden olur. Aşağı olayı kaydettiğimiz ve koordinatların fazla değişmemiş olması durumunda yukarı olayı kontrol ettiğimiz küçük bir değişiklikle, etkinliği başlatınız.
private MotionEvent lastRecyclerViewDownTouchEvent;
myRecyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN && myRecyclerView.findChildViewUnder(event.getX(), event.getY()) == null) {
lastRecyclerViewDownTouchEvent = event;
} else if (event.getAction() == MotionEvent.ACTION_UP && myRecyclerView.findChildViewUnder(event.getX(), event.getY()) == null
&& lastRecyclerViewDownTouchEvent != null) {
// Check to see if it was a tap or a swipe
float xDelta = Math.abs(lastRecyclerViewDownTouchEvent.getX() - event.getX());
float yDelta = Math.abs(lastRecyclerViewDownTouchEvent.getY() - event.getY());
if (xDelta < 30 && yDelta < 30) {
// Do action
}
lastRecyclerViewDownTouchEvent = null;
}
return false;
}
});
- 1. Öğelerin ikisi arasındaki öğelerin karşılaştırılması Öğeleri
- 2. Tost mesajlarını tespit etme
- 3. Geri Dönüşüm Kutusu durumunu Geri Dönüşüm Kutusu Durumu
- 4. Xamarin.Android MvxListView geri dönüşüm
- 5. python'da sesli harfleri tespit etme
- 6. GWT'de yenileme olayını tespit etme
- 7. Paypal Abonelik İptalini Tespit Etme
- 8. Rails precompile assets Öğelerin yürütülebilirliği tespit edilmedi
- 9. Rota Değişimi Reaktif yönlendiriciyle Tespit Etme
- 10. Uygulama ön plan olayını tespit etme
- 11. Hızlandırılmış Kaydırma Geri Dönüşüm Görünümü
- 12. Python: Öğeleri saklamaksızın jeneratördeki öğelerin sayısını alın
- 13. UIViewController: matkabı ve delme işlemini tespit etme
- 14. Kulaklıkların VBScript ile takılıp takılmadığını tespit etme
- 15. Android'de 4K UHD ekranlarını tespit etme
- 16. hola eklentisi olan kullanıcıları tespit etme
- 17. Tarayıcıyı Tespit Etme Asp.net üzerinde kapat
- 18. RSS beslemesinde yeni yeni öğeler tespit etme
- 19. Ne kadar kullanıcı kaydırdığını tespit etme
- 20. Swift'teki tuşa basma olayını tespit etme
- 21. Kurulum sırasında Telefon Satıcısı'nı Tespit Etme
- 22. jQuery var olmayan öğeyi tespit etme
- 23. pandalar veri çerçevesindeki olayları tespit etme
- 24. Dizideki tüm öğelerin sıfır olup olmadığını kontrol etme
- 25. Android Maps Geri Dönüşüm V2 SupportMapFragmenti döndürürken
- 26. SignalR: bağlantı zamanda uygulama havuzu geri dönüşüm
- 27. Android ParseQueryApplication ile Geri Dönüşüm Listeleme.Adapter
- 28. Geri Dönüşüm Kutusu'nda bir ProgressBar Güncelleme
- 29. Bazı Youtube Videoları Geri Dönüşüm Görüntülenmesinde Gösteriliyor
- 30. Bir raydaki değişiklikleri tespit etme has_many: yoluyla ilişkilendirme
Çok teşekkür ederim! FindChildViewUnder (..) ile recyclerView.addOnItemTouchListener kullanarak bitti. – Omar
@Omar Ah! Çok iyi! Kendimi RecyclerView ile tanıştım ve henüz bu arayüzden haberdar değildim. Bilgi için teşekkürler! Bunun için bir cevap oluşturmanız gerekir. Benden bir not alacaksın. –