在我的Android应用中,我有一个带有ViewFlipper的Activity。在Viewflipper中,我有3个线性布局。
<ViewFlipper
android:id="@+id/viewFlipper"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="20dip"
android:text="@string/publicas"
android:textAppearance="?android:attr/textAppearanceLarge" />
<ListView
android:id="@+id/listViewDemandasPublicas"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="20dip"
android:text="@string/pendientes"
android:textAppearance="?android:attr/textAppearanceLarge" />
<ListView
android:id="@+id/listViewDemandasPendientes"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="20dip"
android:text="@string/pendientes"
android:textAppearance="?android:attr/textAppearanceLarge" />
<ListView
android:id="@+id/listViewDemandasFinalizadas"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ViewFlipper>
所以我想在水平滚动时更改包含的ViewFlippers。因此,我实现了一个手势检测器和一个手势侦听器。即使我里面有一个ListView,它也能正常工作(我在另一个活动中已经完成)。我的onScroll方法是下一个方法:
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
ViewFlipper vf = (ViewFlipper) getWindow().findViewById(R.id.viewFlipper);
View view = null;
if ((e1.getX() < e2.getX()) && (distanceX < -20)) { // dedo a la derecha
Log.i("ListaDemandas", "Muevo a la derecha SCROLL");
if (esPendientes) {
esPendientes = false;
esEntrada = true;
verPublicas(view);
vf.setInAnimation(AnimationUtils.loadAnimation(getParent(), R.anim.push_right_in));
vf.setOutAnimation(AnimationUtils.loadAnimation(getParent(), R.anim.push_right_out));
vf.showPrevious();
} else if (esFinalizadas) {
esFinalizadas = false;
esPendientes = true;
verPendientes(view);
vf.setInAnimation(AnimationUtils.loadAnimation(getParent(), R.anim.push_right_in));
vf.setOutAnimation(AnimationUtils.loadAnimation(getParent(), R.anim.push_right_out));
vf.showPrevious();
}
} else if ((e1.getX() > e2.getX()) && (distanceX > 20)) {
Log.i("ListaDemandas", "Muevo a la izquierda SCROLL");
if (esPendientes) {
esPendientes = false;
esFinalizadas = true;
verFinalizadas(view);
vf.setInAnimation(AnimationUtils.loadAnimation(getParent(), R.anim.push_left_in));
vf.setOutAnimation(AnimationUtils.loadAnimation(getParent(), .anim.push_left_out));
vf.showNext();
} else if (esEntrada) {
esEntrada = false;
esPendientes = true;
verPendientes(view);
vf.setInAnimation(AnimationUtils.loadAnimation(getParent(), R.anim.push_left_in));
vf.setOutAnimation(AnimationUtils.loadAnimation(getParent(), .anim.push_left_out));
vf.showNext();
}
}
return true;
}
我的问题是(每次)滚动距离大于20时都会调用onScroll(当然)。因此,如果我进行长滚动,则每次滚动运动大于20时都会调用该方法。因此,如果我的Scroll的距离为50,则在21、22、23中调用该方法。
我该如何管理才能使方法仅被调用一次?我一直在阅读API,并且一直在尝试控制MotionEvent时间,但这并不是一个好的解决方案,因为我可以进行两次快速滚动。我也看到过addBatch方法。这是我的解决方案吗?有人知道如何将所有呼叫分批处理吗?有什么“手工”方式吗?
谢谢
================================================== ================================================== =========
编辑:
我已经通过手工方式解决了。使用true newScroll初始化的布尔值。因此,当我制作Scroll时,将其设置为false,然后将onDown()设置为true。所以:
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
ViewFlipper vf = (ViewFlipper) getWindow().findViewById(R.id.viewFlipper);
if (scrollNuevo) {
if ((e1.getX() < e2.getX()) && (distanceX < -20)) {
Log.i("ListaDemandas", "Muevo a la derecha SCROLL");
scrollNuevo = false; Log.i("ListaDemandas","ScrollNuevo=false");
if (esPendientes) {
...
以及方法onDown:
@Override
public boolean onDown(MotionEvent e) {
scrollNuevo = true;Log.i("ListaDemandas","ScrollNuevo=true");
return true;
}
最佳答案
我已经通过手工方式解决了。使用true newScroll初始化的布尔值。因此,当我制作Scroll时,将其设置为false,然后将onDown()设置为true。所以:
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
ViewFlipper vf = (ViewFlipper) getWindow().findViewById(R.id.viewFlipper);
if (scrollNuevo) {
if ((e1.getX() < e2.getX()) && (distanceX < -20)) {
Log.i("ListaDemandas", "Muevo a la derecha SCROLL");
scrollNuevo = false; Log.i("ListaDemandas","ScrollNuevo=false");
if (esPendientes) {
...
以及方法onDown:
@Override
public boolean onDown(MotionEvent e) {
scrollNuevo = true;Log.i("ListaDemandas","ScrollNuevo=true");
return true;
}