ViewFlipper non funziona quando si fa scorrere il dito. Se metto qualche altra vista al posto della lista, il flipping funziona bene. C'è qualche altro codice che dovrei aggiungere per un listview? E vista di scorrimento all'interno vista flipper, inoltre, non funziona per me :( Questo è il mio codice XMLViewFlipper non si gira con child listview
<?xml version="1.0" encoding="utf-8"?>
<ViewFlipper xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/vf"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/list1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/list2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
</ViewFlipper>
Questo è il mio codice della classe.
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.ViewFlipper;
import android.widget.AdapterView.OnItemClickListener;
public class MainActivity extends Activity {
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 gestureDetector;
View.OnTouchListener gestureListener;
private Animation slideLeftIn;
private Animation slideLeftOut;
private Animation slideRightIn;
private Animation slideRightOut;
private ViewFlipper viewFlipper;
private ListView lv;
private String[] city = { "Indore", "Bhopal", "Khargone", "Ujjain",
"Nasik", "Pune", "Delhi", "Mumbai", "Noida", "Hyderabad",
"Banglore", "Ajmer", "Goa", "Jaipur", "Nagpur", "" };
private String[] country = { "India", "Bhutan", "Kuwait", "USA", };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
lv = (ListView) findViewById(R.id.List01);
ListView lv2 = (ListView) findViewById(R.id.List02);
viewFlipper = (ViewFlipper) findViewById(R.id.flipper);
slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.slide_left_in);
slideLeftOut = AnimationUtils
.loadAnimation(this, R.anim.slide_left_out);
slideRightIn = AnimationUtils
.loadAnimation(this, R.anim.slide_right_in);
slideRightOut = AnimationUtils.loadAnimation(this,
R.anim.slide_right_out);
gestureDetector = new GestureDetector(new MyGestureDetector());
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
return false;
}
};
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, city));
lv2.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, country));
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView arg0, View view, int position,
long id) {
// user clicked a list item, make it "selected"
Toast.makeText(getBaseContext(), "Item Clicked",
Toast.LENGTH_SHORT).show();
// selectedAdapter.setSelectedPosition(position);
}
});
lv2.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView arg0, View view, int position,
long id) {
// user clicked a list item, make it "selected"
Toast.makeText(getBaseContext(), "Item List2 Clicked",
Toast.LENGTH_SHORT).show();
// selectedAdapter.setSelectedPosition(position);
}
});
}
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) {
viewFlipper.setInAnimation(slideLeftIn);
viewFlipper.setOutAnimation(slideLeftOut);
viewFlipper.showNext();
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
viewFlipper.setInAnimation(slideRightIn);
viewFlipper.setOutAnimation(slideRightOut);
viewFlipper.showPrevious();
}
} catch (Exception e) {
// nothing
}
return false;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (gestureDetector.onTouchEvent(event))
return true;
else
return false;
}
}
Override dispatchTouchEvent invece di onTouchEvent rende sia vista di scorrimento e bel gesto di lavoro.
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
super.dispatchTouchEvent(event);
return gestureDetector.onTouchEvent(event);
}
Grazie, la soluzione di usare dispatchTouchEvent invece di onTouchEvent mi ha aiutato. – anujprashar
@anujprashar Prego :) –
Grazie, funziona benissimo :) – Kutbi