MetBo
Erfahrenes Mitglied
- 4
Hallo,
ich habe in meiner App eine ListView, in der ich gerne die "Fling Gesture" einbauen möchte. Dabei soll nicht die gesamte ListView angesprochen werden, sondern nur einzelne Einträge (wie in der Twitter-App, wenn man nach rechts oder links swipt).
Um dies umzusetzen, habe ich mir gedacht, dass ich in jedem Eintrag ein ViewFlipper einbaue und über den Adapter die Gesten steuere.
Problem dabei ist: Generell funktioniert dies ja, aber leider wird beim "flingen" immer der letzte Eintrag in der ListView angesprochen.
Habt ihr eine Idee, wie ich jeden Eintrag einzeln ansprechen kann?
Oder kennt ihr einen besseren Lösungsweg, wie ich dieses Feature von der Twitter-App nachbauen kann?
Vielen Dank,
Grüße
ich habe in meiner App eine ListView, in der ich gerne die "Fling Gesture" einbauen möchte. Dabei soll nicht die gesamte ListView angesprochen werden, sondern nur einzelne Einträge (wie in der Twitter-App, wenn man nach rechts oder links swipt).
Um dies umzusetzen, habe ich mir gedacht, dass ich in jedem Eintrag ein ViewFlipper einbaue und über den Adapter die Gesten steuere.
Code:
package com.scibli.audio.recorder.utils;
import java.util.ArrayList;
import android.content.Context;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.ViewFlipper;
import com.scibli.audio.recorder.R;
public class FileInfoAdapter extends BaseAdapter implements OnGestureListener, OnTouchListener {
protected static final CharSequence TAG = Util.getPackageName();
protected static final int SWIPE_MIN_DISTANCE = 120;
protected static final int SWIPE_MAX_OFF_PATH = 250;
protected static final int SWIPE_THRESHOLD_VELOCITY = 200;
protected final Context mContext;
protected final LayoutInflater mLayoutInflater;
protected final GestureDetector mGestureDetector;
protected ArrayList<FileInfo> mFileInfos;
protected TextView mTextFileName;
protected TextView mTextDateTime;
protected TextView mTextFileSize;
protected TextView mTextDuration;
protected TextView mTextFileFormat;
protected ViewFlipper mFlipperEntry;
public FileInfoAdapter(Context context, ArrayList<FileInfo> fileInfos) {
mContext = context;
mFileInfos = fileInfos;
mLayoutInflater = (LayoutInflater) mContext.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
mGestureDetector = new GestureDetector(this);
}
@Override
public int getCount() {
return mFileInfos.size();
}
@Override
public Object getItem(int arg0) {
return mFileInfos.get(arg0);
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
final View view = mLayoutInflater.inflate(R.layout.recorderlist_entry, null);
final FileInfo fileInfo = mFileInfos.get(arg0);
final CharSequence dateTime = android.text.format.DateFormat.getMediumDateFormat(mContext).format(
fileInfo.getDateTime()) + " " + android.text.format.DateFormat.getTimeFormat(mContext).format(
fileInfo.getDateTime());
mTextFileName = (TextView) view.findViewById(R.id.textFileName);
mTextFileName.setText(fileInfo.getFileName());
mTextDateTime = (TextView) view.findViewById(R.id.textDateTime);
mTextDateTime.setText(dateTime);
mTextFileSize = (TextView) view.findViewById(R.id.textFileSize);
mTextFileSize.setText(fileInfo.getFileSize());
mTextDuration = (TextView) view.findViewById(R.id.textDuration);
mTextDuration.setText(fileInfo.getDuration());
mTextFileFormat = (TextView) view.findViewById(R.id.textFileFormat);
mTextFileFormat.setText(fileInfo.getFileFormat());
mFlipperEntry =(ViewFlipper) view.findViewById(R.id.flipperEntry);
mFlipperEntry.setInAnimation(mContext, android.R.anim.fade_in);
mFlipperEntry.setOutAnimation(mContext, android.R.anim.fade_out);
view.setOnTouchListener((OnTouchListener) this);
return view;
}
@Override
public boolean onDown(MotionEvent arg0) {
return true;
}
@Override
public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
float arg3) {
try {
if(arg0.getX() > arg1.getX() && Math.abs(arg0.getX() - arg1.getX()) > SWIPE_MIN_DISTANCE
&& Math.abs(arg2) > SWIPE_THRESHOLD_VELOCITY) {
mFlipperEntry.showNext();
}else if (arg0.getX() < arg1.getX() && arg1.getX() - arg0.getX() > SWIPE_MIN_DISTANCE
&& Math.abs(arg2) > SWIPE_THRESHOLD_VELOCITY) {
mFlipperEntry.showPrevious();
}
} catch (Exception e) {
Log.e(TAG.toString(), e.getMessage());
}
return true;
}
@Override
public void onLongPress(MotionEvent arg0) {}
@Override
public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
float arg3) {
return true;
}
@Override
public void onShowPress(MotionEvent arg0) {}
@Override
public boolean onSingleTapUp(MotionEvent arg0) {
return true;
}
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
return mGestureDetector.onTouchEvent(arg1);
}
}
Problem dabei ist: Generell funktioniert dies ja, aber leider wird beim "flingen" immer der letzte Eintrag in der ListView angesprochen.
Habt ihr eine Idee, wie ich jeden Eintrag einzeln ansprechen kann?
Oder kennt ihr einen besseren Lösungsweg, wie ich dieses Feature von der Twitter-App nachbauen kann?
Vielen Dank,
Grüße