J'ai une activité qui contient un ViewFlipper. Le ViewFlipper comprend 2 mises en page, qui sont essentiellement des ListViews. Donc, l'idée ici est que j'ai deux listes et pour naviguer de l'une à l'autre, j'utiliserais un balayage horizontal.Problème lors de la détection de gestes sur ListView
J'ai cela qui fonctionne. Cependant, quel que soit l'élément de liste sur lequel se trouve votre doigt lorsque le balayage commence à s'exécuter, cet élément sera également cliqué longuement.
Voici le code approprié je:
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);
}
…
}
Si je change le "return true;" déclaration de la GestureDetector à "return false;", je ne reçois pas de clics longs. Malheureusement, je reçois des clics réguliers.
Est-ce que quelqu'un sait comment je peux contourner cela?
Ceci est similaire à un composant que j'ai récemment développé, sauf que j'ai ajouté le recyclage de la vue à la mienne et sa soutenu par un listAdapter. Fondamentalement, j'ai kangé un tas de code ListView et attaché à un mouvement personnalisé HorizontalScrollView comme vous l'avez fait. – jfelectron
Oui, je travaille aussi sur l'ajout de SwipeView! Aussi, j'ai juste (littéralement juste, environ 2 minutes) remarqué qu'il y a un bug avec ListViews sur un SwipeView. J'ai maintenant corrigé le bug et mis à jour le repo git. https://github.com/fry15/uk.co.jasonfry.android.tools – jsonfry
jfelectron est à vous sur GIThub? –