Mam działanie, które zawiera ViewFlipper. ViewFlipper zawiera 2 układy, z których oba są po prostu ListViews.Problemy z wykrywaniem gestów na liście ListView
Pomysł polega na tym, że mam dwie listy i aby poruszać się między nimi, użyłbym poziomego przesunięcia.
Mam to działa. Jednak, jeśli kiedykolwiek pojawi się lista elementów, na których znajduje się palec, gdy rozpoczyna się machnięcia, ten element będzie również długo klikany.
Oto odpowiedni kod mam:
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);
}
…
}
Gdybym zmienić "return true;" oświadczenie od GestureDetector do "return false;", nie dostaję długich kliknięć. Niestety, uzyskuję regularne kliknięcia.
Czy ktoś wie, jak sobie z tym poradzić?
Jest to podobne do ostatnio opracowanego komponentu, z tym wyjątkiem, że dodałem widok recyklingu do kopalni i jej wspierane przez listadapter. Zasadniczo, użyłem kępki kodu ListView i dołączałem go do niestandardowego gestu HorizontalScrollView, tak jak ty. – jfelectron
Tak, pracuję nad dodaniem tego do SwipeView też! Ponadto, właśnie (dosłownie około 2 minuty temu) zauważyłem, że istnieje błąd z ListViews na SwipeView. Naprawiłem błąd i zaktualizowałem repozytorium git. https://github.com/fry15/uk.co.jasonfry.android.tools – jsonfry
jfelectron jest jednak na GIThub? –