2011-05-27 4 views
8

Je voudrais avoir dans mon application le même comportement de l'application de contacts natifs. Plus précisément, je voudrais mettre en œuvre le balayage à droite pour l'appel et le balayage à gauche pour le textmsg. J'ai un ListView, j'ai mis en place arrayAdapter et j'ai implémenté le détecteur de mouvement pour onFlingMethod. J'intercepte correctement le côté de balayage et je peux lancer l'application d'appel. J'ai besoin de mettre le numéro de l'article (et d'autres informations) à l'intention, donc j'ai besoin d'obtenir l'article glissé. Voici mon code.OnFling dans un ListView, Obtenez le glissé Informations sur l'article

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; 
     } 

    } 
} 
+0

Quel est le problème ici? Est-ce que cela fonctionne comme prévu? – Ads

Répondre

7

Je résous 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; 
} 

Tout d'abord, vous obtenez le rowID de list.pointToPosition((int) e1.getX(), (int) e1.getY()); et faire avec tout ce que vous voulez. Dans mon cas, le rappel est le type d'objets dans mon adaptateur de tableau personnalisé pour la liste.

0

Je suppose que la façon de le faire serait d'ajouter le GestureListener à la ligne, comme vous le faites avec le 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, il peut être préférable de calculer quelle vue a été glissée en utilisant la position de balayage et les vues.

0

Enfin j'ai obtenu solution obtenir l'index quand swipe à gauche ou à droite sur la Liste .... @Override publique onFling booléenne (MotionEvent e1, e2 MotionEvent, flotter velocityX, flotter 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; 
    } 
Questions connexes