ListView beinhaltet RatingBars und scrollt deshalb nicht richtig

  • Antworten:5
Gelöschter Account
  • Forum-Beiträge: 101

02.08.2011, 16:39:10 via Website

Hallo Ihrs,

ich sitze gerade an einem kniffligen Problem bei dem ihr mir hoffentlich helfen könnt.

Mein Layout besteht aus einer ListView. Das Layout der Einträge besteht aus einer TextView und einer Ratingbar. Wenn ich nun durch die Liste scrollen möchte geht dies wunderbar wenn ich auf die TextView touche und dann mit dem Finger nach oben wische. Drücke ich jedoch auf die Ratingbar und ziehe den Finger nach oben scrollt die ListView nicht mit.

Wie kann ich das Problem lösen? Ich möchte auch die ListView scrollen wenn ich auf die RatingBar drücke.

Über eine Antwort würde ich mich freuen. ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 101

02.08.2011, 16:50:41 via Website

Nein, später sollte dann ein "OnRatingBarChangeListener" registriert werden.

Antworten
Gelöschter Account
  • Forum-Beiträge: 101

03.08.2011, 10:25:59 via Website

Danke für deine Antwort. Das ist schonmal der Anfang. Leider hänge ich nun an einem anderen Problem. Aber erst mal von vorne. ;)

Hier nochmal skizzenhaft das Layout:
1<ListView>
2 <ListEntry>
3 <TextView />
4 <RatingBar />
5 </ListEntry>
6 <ListEntry>
7 <TextView />
8 <RatingBar />
9 </ListEntry>
10 <ListEntry>
11 <TextView />
12 <RatingBar />
13 </ListEntry>
14</ListView>

Im ListAdapter wird beim erstellen der ListEntry-View bei der RatingBar mit setOnTouchListener ein neuer TouchListener registriert. Dessen onTouch-Methode wie folgt aussieht:
1@Override
2 public boolean onTouch(View v, MotionEvent event) {
3 return this.detector.onTouchEvent(event);
4 }

detector ist hierbei ein GestureDetector. In seiner
1onScroll
-Methode überprüfe ich ob horizontal oder vertikal gescrollt wird. Ist letzteres der Fall übergebe ich das MotionEvent an die ListView per dispatchTouchEvent. Hier die ganze Methode:
1@Override
2 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
3 float dX = Math.abs(e1.getX()-e2.getX());
4 float dY = Math.abs(e1.getY()-e2.getY());
5
6 if(dY > dX){
7 list.dispatchTouchEvent(e1);
8 return true;
9 }
10 return false;
11 }

Das ganze funktioniert auch sehr gut, die ListView scrollt ganz gut. Nun zu meinem Problem: Ab und an scrollt die ListView in die entgegengesetzte Richtung, wische ich mit dem Finger nach oben scrollt die ListView nicht nach unten sondern nach oben. Ich habe keine Ahnung woran das liegen kann. Ihr?

Nach eifrigem googeln bin ich auf folgenden Eintrag in der google-android-group gestoßen. Ist dieses komische Verhalten der ListView wirklich ein Android-Bug der schon seit März 2009 besteht und noch nicht behoben wurde? Oder hab ich hier ein anderes Problem? Für meine App benutze ich die API von Android 2.2.

Über Antworten würde ich mich sehr freuen und bedanke mich schonmal im vorraus.

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

03.08.2011, 12:27:03 via Website

Nur geraten: Nimm mal das abs() weg.

Ich nehme immer die X/Y Rohdaten der MotionEvents - egal ob onScoll oder onFling. Ich könnte mir gut vorstellen das es mal zu einem Vergleich von -1.xxx zu +2.xxx kommt und dann erzeugt der abs() ein falsches Ergebnis.

Antworten