Elementy ListView w Androidzie przewijaj pojedynczo
Czy Jest jakiś sposób, w jaki przewijamy ListView
przedmioty tylko jeden na raz.
Podobnie jak po przesunięciu w górę będzie przewijać tylko jeden element w górę, a nie normalne przewijanie podobne do przewijania w dół tylko jeden element przesuwa się w dół.
Oto Mój kod:
public class ListViewTestExample extends Activity {
ListView listView;
private GestureDetectorCompat mDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_list_view_test);
mDetector = new GestureDetectorCompat(this, new MyGestureListener());
// Grid ListView object from XML
listView = (ListView) findViewById(R.id.list);
mDetector = new GestureDetectorCompat(this, new MyGestureListener());
// Defined Array values to show in ListView
String[] values = new String[] { "Android List View",
"Adapter implementation", "Simple List View In Android",
"Create List View Android", "Android Example",
"List View Source Code", "List View Array Adapter",
"Android Example List View" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, values);
listView.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public boolean onTouchEvent(MotionEvent event) {
this.mDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
Context context = getApplicationContext();
public boolean onDown(MotionEvent event) {
return true;
}
public void onLongPress(MotionEvent event) {
Toast.makeText(context, "Long Press", Toast.LENGTH_SHORT).show();
}
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY) {
float sensitvity = 50;
// TODO Auto-generated method stub
if ((event1.getX() - event2.getX()) > sensitvity) {
Toast.makeText(context, "Swipe Left", Toast.LENGTH_SHORT)
.show();
} else if ((event2.getX() - event1.getX()) > sensitvity) {
Toast.makeText(context, "Swipe Right", Toast.LENGTH_SHORT)
.show();
}
if ((event1.getY() - event2.getY()) > sensitvity) {
if (event2.getPressure() > event1.getPressure()) {
Toast.makeText(context, "Swipe Up + Hold",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Swipe Up", Toast.LENGTH_SHORT).show();
}
} else if ((event2.getY() - event1.getY()) > sensitvity) {
if (event2.getPressure() > event1.getPressure()) {
Toast.makeText(context, "Swipe Down + Hold",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Swipe Down", Toast.LENGTH_SHORT).show();
}
}
return true;
}
public boolean onSingleTapConfirmed(MotionEvent event) {
Toast.makeText(context, "Single Tap Confirmed", Toast.LENGTH_SHORT)
.show();
return true;
}
public boolean onDoubleTap(MotionEvent event) {
Toast.makeText(context, "Double Tap Confirmed", Toast.LENGTH_SHORT).show();
return true;
}
}
}
2 answers
Możesz użyć listView.setScrollY (wartość int) w ontouchlistener ().Możesz przechwycić Zdarzenie touch i zmierzyć wysokość widoku elementu,a następnie setScrollY (bieżąca wysokość listview + Wysokość elementu).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-16 08:41:57
Wiem, że to już stary post, ale przeszukałem Sieć i nie znalazłem na to rozwiązania. Więc znalazłem rozwiązanie, które działa dla mnie. Musisz utworzyć niestandardowy widok listy i nadpisać funkcję dispatchTouchEvent. Moja wersja sprawdza, czy użytkownik mignął z minimalną prędkością i czy ma następnie płynne przewijanie do następnego elementu. Jeśli pod tą prędkością, sprawdź, czy Element jest w połowie drogi, a następnie wykonaj płynne przewijanie. W przeciwnym razie powróci do bieżącej pozycji. To kod zakłada, że element wypełnia widok.
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.widget.ListView;
/**
* Created by bradj on 11/12/13.
*/
public class SingleScrollListView extends ListView
{
private boolean mSingleScroll = false;
private VelocityTracker mVelocity = null;
final private float mEscapeVelocity = 2000.0f;
final private int mMinDistanceMoved = 20;
private float mStartY = 0;
public SingleScrollListView(Context context)
{
super(context);
}
public SingleScrollListView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public SingleScrollListView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
public void setSingleScroll(boolean aSingleScroll) { mSingleScroll = aSingleScroll; }
public int getVerticalScrollOffset() { return getFirstVisiblePosition(); }
@Override
public boolean dispatchTouchEvent(MotionEvent aMotionEvent)
{
if (aMotionEvent.getAction() == MotionEvent.ACTION_DOWN)
{
if (mSingleScroll && mVelocity == null)
mVelocity = VelocityTracker.obtain();
mStartY = aMotionEvent.getY();
return super.dispatchTouchEvent(aMotionEvent);
}
if (aMotionEvent.getAction() == MotionEvent.ACTION_UP)
{
if (mVelocity != null)
{
if (Math.abs(aMotionEvent.getY() - mStartY) > mMinDistanceMoved)
{
mVelocity.computeCurrentVelocity(1000);
float velocity = mVelocity.getYVelocity();
if (aMotionEvent.getY() > mStartY)
{
// always lock
if (velocity > mEscapeVelocity)
smoothScrollToPosition(getFirstVisiblePosition());
else
{
// lock if over half way there
View view = getChildAt(0);
if (view != null)
{
if (view.getBottom() >= getHeight() / 2)
smoothScrollToPosition(getFirstVisiblePosition());
else
smoothScrollToPosition(getLastVisiblePosition());
}
}
}
else
{
if (velocity < -mEscapeVelocity)
smoothScrollToPosition(getLastVisiblePosition());
else
{
// lock if over half way there
View view = getChildAt(1);
if (view != null)
{
if (view.getTop() <= getHeight() / 2)
smoothScrollToPosition(getLastVisiblePosition());
else
smoothScrollToPosition(getFirstVisiblePosition());
}
}
}
}
mVelocity.recycle();
}
mVelocity = null;
if (mSingleScroll)
{
if (Math.abs(aMotionEvent.getY() - mStartY) > mMinDistanceMoved)
return super.dispatchTouchEvent(aMotionEvent);
}
else
return super.dispatchTouchEvent(aMotionEvent);
}
if (mSingleScroll)
{
if (mVelocity == null)
{
mVelocity = VelocityTracker.obtain();
mStartY = aMotionEvent.getY();
}
mVelocity.addMovement(aMotionEvent);
}
return super.dispatchTouchEvent(aMotionEvent);
}
}
Więc kod prosty staje się jak poniżej. (Nie zapomnij zmienić ListView w xml do SingleScrollListView) nie ma potrzeby gest listener.
listView = (SingleScrollListView) findViewById(R.id.list);
listView.setSingleScroll(true);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-20 01:00:41