OnFling dans un ListView, Obtenez les informations de l'objet Swiped

J'aimerais avoir dans mon application le même comportement d'application de contacts natifs. Plus précisément, j'aimerais implémenter le coup de glissement pour l'appel et le glissement à gauche pour le textmsg. J'ai un ListView, j'ai réglé arrayAdapter et i'va a implémenté le détecteur de geste pour onFlingMethod. Je intercepte correctement le côté du glissement et je peux faire appel à l'Appel. J'ai besoin de mettre le numéro de l'article (et d'autres informations) dans l'intention, alors j'ai besoin d'obtenir l'objet glissé. Voici mon code.

public class Contacts extends Activity implements OnGestureListener { private static final String TAG = "[Contacts]"; ArrayList < ContactInfo > mData; 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; /** Called when the activity is first created. */ private GestureDetector detector = new GestureDetector(this); Button btnContacts; Button btnProfile; Button btnSettings; ImageButton btnStatus; HandleServer cubeServer; Button slideHandleButton; SlidingDrawer slidingDrawer; String filter = "n"; ArrayAdapter < ContactInfo > adapter; ListView listView; public boolean onCreateOptionsMenu(Menu menu) { return true; } public boolean onOptionsItemSelected(MenuItem item) { return true; } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.contact); listView = (ListView) findViewById(R.id.arrayList); listView.setCacheColorHint(R.color.white); mData = getContact(); adapter = new ArrayAdapter < ContactInfo > (this.getApplicationContext(), R.layout.row, R.id.nome, mData) { public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.row, null); viewHolder = new ViewHolder(); final ContactInfo item = getItem(position); viewHolder.name.setText(item.getName()); convertView.setClickable(true); OnClickListener myClickListener = new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(v.getContext(), ContactTabs.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //Log.i(TAG,"id value:"+item.getId()); intent.putExtra("id", item.getId()); intent.putExtra("name", item.getName()); //aggiungi quello che serve per gli extra ed i task intent.putExtra("calendar", item.getCalendarDraw()); intent.putExtra("gmail", item.getGmailDraw()); intent.putExtra("operator", item.getOperatorDraw()); intent.putExtra("imgStatus", item.getImgStatusDraw()); startActivity(intent); } }; convertView.setOnClickListener(myClickListener); convertView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View view, MotionEvent e) { detector.onTouchEvent(e); return false; } }); return convertView; } }; listView.setAdapter(adapter); } public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return false; } 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) { //CallNativeApp cna = new CallNativeApp(getApplicationContext()); //cna.sendSms("11111", ""); Toast.makeText(getApplicationContext(), "Left Swipe", Toast.LENGTH_SHORT).show(); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //CallNativeApp cna = new CallNativeApp(getApplicationContext()); //cna.call("1111"); Toast.makeText(getApplicationContext(), "Right Swipe", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { // nothing } return true; } public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub return true; } public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return true; } } } 

  • Besoin d'aide pour comprendre la fuite de mémoire dans mon application Android
  • La facturation dans l'application dans Android - questions
  • Développez et mettez l'accent sur SearchView automatiquement
  • Masquer la barre d'action contextuelle tandis que le tiroir de navigation est ouvert
  • Gros morceau de mémoire, pas de déchets collectés
  • Est-il possible de détecter la désinstallation d'une application Android?
  • RecyclerView: Incohérence détectée. Position de l'élément invalide
  • Comment redimensionner l'écran Android interne du terminal / shell
  • Pourquoi puis-je obtenir une signature non valide sur l'API Android de Google Maps?
  • Android désactivez la touche Entrée dans le clavier doux
  • Quel est le moyen le plus fiable de déterminer la fréquence d'horloge de la CPU des téléphones Android?
  • DistanceBetween () renvoie un résultat inexact?
  • 3 Solutions collect form web for “OnFling dans un ListView, Obtenez les informations de l'objet Swiped”

    Je résolve ce problème avec la méthode ListView.pointToPosition() .

    Voici mon fragment de code:

     @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (e2.getX() - e1.getX() > MOVE) { int id = list.pointToPosition((int) e1.getX(), (int) e1.getY()); Reminder temp = (Reminder) adapter.getItem((id)); return true; } return false; } 

    D'abord, vous obtenez le rowID de list.pointToPosition((int) e1.getX(), (int) e1.getY()); Et faites avec vous tout ce que vous voulez. Dans mon cas, le rappel est le type d'objets dans ma carte matrice personnalisée pour la liste.

    Je suppose que la façon de le faire serait d'ajouter GestureListener à la ligne, comme vous le faites avec OnClickListener, au lieu de l'activité principale.

    Si vous avez une grande liste, cela signifierait beaucoup de GestureListeners et pourrait affecter les performances. Dans ce cas, vous pourriez être mieux de calculer quelle vue a été glissée à l'aide de la position de glissement et des vues.

    Enfin, j'ai obtenu une solution pour obtenir un index lorsque vous faites glisser à gauche ou à droite sur la vue Liste …. @Override public boolean onFling (MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

      boolean result = false; try { float diffY = e2.getY() - e1.getY(); float diffX = e2.getX() - e1.getX(); if (Math.abs(diffX) > Math.abs(diffY)) { if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { if (diffX > 0) { int id = list.pointToPosition((int) e1.getX(), (int) e1.getY()); task = (TaskClass) adapter.getItem((id)); Log.e("Result", "Result..."+task.toString()); onSwipeRight(task.milestonetask); } else { int id = list.pointToPosition((int) e1.getX(), (int) e1.getY()); task = (TaskClass) adapter.getItem((id)); onSwipeLeft(task.milestonetask); } } } else { if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) { if (diffY > 0) { onSwipeBottom(); } else { onSwipeTop(); } } } } catch (Exception exception) { exception.printStackTrace(); } return result; } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.