2010-12-15 171 views
1

J'ai une classe qui étend ListActivity. Cette classe montre un AbsListView rempli d'ID de bus et un bus Noms sur chaque ligne ... J'essaie de gérer le bus Nom d'une rangée lorsque je fais un geste de balayage sur ... ('onFling') mais quand je le fais cela, le geste est géré correctement mais je peux juste obtenir les Vues (avec findViewByID()) de la première rangée .... Je dois obtenir les Vues de la rangée Flinged!Android findViewById() avec onFling dans le problème ListView

Merci!

Ceci est mon code ...:

public class dayBusList extends ListActivity{ 

    AbsListView lv; 
AABDatabaseManager db; 

    GestureDetector mGestureDetector = null; 
View.OnTouchListener mGestureListener = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     db = new AABDatabaseManager(dayBusList.this); 
     setListAdapter(new SpeechListAdapter(this)); 



     lv = getListView(); 
     lv.setTextFilterEnabled(true); 
     lv.setBackgroundColor(0xffffffff); 
     lv.setFastScrollEnabled(true); 
     lv.setSoundEffectsEnabled(true); 

     //Gesture detector for swipe... 

     mGestureDetector = new GestureDetector(new MyGestureDetector()); 

      mGestureListener = new View.OnTouchListener() { 
       public boolean onTouch(View v, MotionEvent aEvent) { 

        if (mGestureDetector.onTouchEvent(aEvent)) 
         return true; 
        else 
         return false; 
        } 
       }; 
     lv.setOnTouchListener(mGestureListener); 

.......> RACCORD DE LA VUE LISTE

private class SpeechListAdapter extends BaseAdapter { 

     private Context mContext; 
     private String[] busIDS = db.getDayBusIds(); 
     private String[] busNAMES = db.getDayBusNames(); 

      public SpeechListAdapter(Context context) { 

       mContext = context; 
      } 

      public int getCount() { 
       return busNAMES.length; 
      } 

      public Object getItem(int position) { 
       return position; 
      } 

      public long getItemId(int position) { 
       return position; 
      } 

      public View getView(int position, View convertView, ViewGroup parent) { 
       SpeechView sv; 

       if (convertView == null) { 
        sv = new SpeechView(mContext, busIDS[position], 
          busNAMES[position]); 
       } else { 
        sv = (SpeechView) convertView; 
        sv.setTitle(busIDS[position]); 
        sv.setDialogue(busNAMES[position]); 
       } 
       return sv; 
      } 

     } 

     private class SpeechView extends LinearLayout { 

      private TextView busID; 
      private TextView busNAME; 

      public SpeechView(Context context, String title, String words) { 
       super(context); 

       this.setOrientation(HORIZONTAL); 

       ImageView busIcon = new ImageView(context); 
       busIcon.setImageResource(R.drawable.stm); 
       busIcon.setPadding(2, 20, 5, 20); 
       addView(busIcon,new LinearLayout.LayoutParams(
         LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

       busID = new TextView(context); 
       busID.setId(1); 
       busID.setTextSize(30); 
       busID.setTextColor(Color.BLUE); 
       busID.setPadding(5, 15, 5, 20); 
       //busID.setPadding(0, 0,10, 0); 
       busID.setText(title); 
       addView(busID, new LinearLayout.LayoutParams(
         LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

       busNAME = new TextView(context); 
       busNAME.setId(2); 
       busNAME.setGravity(Gravity.TOP); 
       busNAME.setTextSize(15); 
       busNAME.setPadding(0, 0, 0, 0); 
       busNAME.setText(words); 
       busNAME.setTextColor(Color.GREEN); 
       busNAME.setWidth(160); 
       addView(busNAME, new LinearLayout.LayoutParams(
         LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
      } 

      public void setTitle(String id) { 
       busID.setText(id); 
      } 

      public void setDialogue(String name) { 
       busNAME.setText(name); 
      } 
     } 

.......> La classe pour la détection de geste

class MyGestureDetector extends SimpleOnGestureListener { 
    private static final int SWIPE_MIN_DISTANCE = 200; 
    private static final int SWIPE_MAX_OFF_PATH = 100; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 100; 

    @Override 
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
       float dX = e2.getX()-e1.getX(); 
       float dY = e1.getY()-e2.getY(); 
       if (Math.abs(dY)<SWIPE_MAX_OFF_PATH && 
        Math.abs(velocityX)>=SWIPE_THRESHOLD_VELOCITY && 
        Math.abs(dX)>=SWIPE_MIN_DISTANCE) { 
        if (dX>0) { 
         Toast.makeText(getApplicationContext(), ((TextView) findViewById(1)).getText()+"Right Swipe", Toast.LENGTH_SHORT).show(); 
        } else { 
         Toast.makeText(getApplicationContext(), ((TextView) findViewById(1)).getText()+"Left Swipe", Toast.LENGTH_SHORT).show(); 
        } 
        return true; 
       } 
       return false; 
      } 

     } 

Répondre

0

Vous venez tout juste d'être chanceux que findViewById(1)) est réellement défini. Vous ne devriez pas appeler findViweById dans votre détecteur de mouvement. Je suis surpris que ça ne plante pas. Au lieu de cela, vous obtenez à nouveau la vue dans votre onGestureListener. Utilisez-le là.

1

Une option consiste à remplacer/implémenter l'onTouchEvent() de votre classe SpeechView et à gérer le glissement dans l'instance SpeechView elle-même. Vous pouvez ensuite examiner les propriétés de l'instance SpeechView pour savoir quelle ligne a été glissée.

public class SpeechView extends LinearLayout 
{ 
    @Override 
    public boolean onTouchEvent(MotionEvent ev) 
    { 
     // 1) process any specific SpeecView instance variables. 
     // 2) pass event to a gestureDetector. 
     return true; 
    } 

} 

De plus, vous pouvez passer un GestureDetector dans votre SpeechListAdapter et nourrir à la classe SpeechView quand il est créé à l'origine. Ensuite, vous pouvez passer les MotionEvents dans celui-ci.

Dans les deux cas, veillez à intercepter l'événement tactile en renvoyant true.

public boolean onTouchEvent(MotionEvent me) 
{ 
    m_gestureDetector.onTouchEvent(me); 
    return true; 
}