Ich habe eine Aktivität, die einen ViewFlipper enthält. Der ViewFlipper enthält 2 Layouts, bei denen es sich im Wesentlichen nur um ListViews handelt.Probleme beim Erkennen von Gesten über ListView
Also die Idee hier ist, dass ich zwei Listen habe und von einem zum anderen zu navigieren, würde ich einen horizontalen Swipe verwenden.
Ich habe das funktioniert. Wie auch immer das Element, auf das sich der Finger bezieht, wenn der Swipe beginnt, wird auch auf diesen Gegenstand geklickt.
Hier ist der relevante Code, den ich habe:
public class MyActivity extends Activity implements OnItemClickListener, OnClickListener {
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private GestureDetector mGestureDetector;
View.OnTouchListener mGestureListener;
class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// right to left swipe
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if (mCurrentScreen != SCREEN_SECONDLIST) {
mCurrentScreen = SCREEN_SECONDLIST;
mFlipper.setInAnimation(inFromRightAnimation());
mFlipper.setOutAnimation(outToLeftAnimation());
mFlipper.showNext();
updateNavigationBar();
}
}
else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if (mCurrentScreen != SCREEN_FIRSTLIST) {
mCurrentScreen = SCREEN_FIRSTLIST;
mFlipper.setInAnimation(inFromLeftAnimation());
mFlipper.setOutAnimation(outToRightAnimation());
mFlipper.showPrevious();
updateNavigationBar();
}
}
} catch (Exception e) {
// nothing
}
return true;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mGestureDetector.onTouchEvent(event))
return true;
else
return false;
}
ViewFlipper mFlipper;
private int mCurrentScreen = SCREEN_FIRSTLIST;
private ListView mList1;
private ListView mList2;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.layout_flipper);
mFlipper = (ViewFlipper) findViewById(R.id.flipper);
mGestureDetector = new GestureDetector(new MyGestureDetector());
mGestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (mGestureDetector.onTouchEvent(event)) {
return true;
}
return false;
}
};
// set up List1 screen
mList1List = (ListView)findViewById(R.id.list1);
mList1List.setOnItemClickListener(this);
mList1List.setOnTouchListener(mGestureListener);
// set up List2 screen
mList2List = (ListView)findViewById(R.id.list2);
mList2List.setOnItemClickListener(this);
mList2List.setOnTouchListener(mGestureListener);
}
…
}
Wenn ich das ändern "return true;" Aussage vom GestureDetector zu "return false;", bekomme ich keine langen Klicks. Leider bekomme ich normale Klicks.
Weiß jemand, wie ich das umgehen kann?
Dies ist ähnlich einer Komponente, die ich vor kurzem entwickelt, außer dass ich Ansichtsrecycling zu mir und seine hinzugefügt unterstützt von einem listAdapter. Im Grunde habe ich eine Menge ListView-Code zusammengefügt und an eine benutzerdefinierte Gesten-gesteuerte HorizontalScrollView-Datei angehängt. – jfelectron
Ja, ich arbeite daran, das auch zu SwipeView hinzuzufügen! Außerdem habe ich gerade (vor knapp 2 Minuten) bemerkt, dass es einen Fehler mit ListViews auf einem SwipeView gibt. Ich habe jetzt den Fehler behoben und das Git Repo aktualisiert. https://github.com/fry15/uk.co.jasonfry.android.tools – jsonfry
jfelectron gehört Ihnen auf GIThub obwohl? –