2010-12-15 59 views
1

我有一個擴展ListActivity的類。 這個班級顯示了一個AbsListView,填充了公交ID和公交ID每行的名稱... 我試圖處理公交車當我在...上做滑動手勢時('onFling'),但是當我做該手勢正確處理,但我可以得到第一行的視圖(與findViewByID())....我需要得到Flinged行的視圖!Android findViewById()在ListView問題中onFling

謝謝!

這是我的代碼...:

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

.......>列表視圖

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

適配器.......>類用於手勢檢測

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

     } 

回答

0

你碰巧很幸運findViewById(1))實際上是定義好的。你不應該在你的手勢檢測器中調用findViweById。我很驚訝,不會崩潰。

取而代之,您將視圖返回到onGestureListener中。在那裏使用它。

1

一種選擇是覆蓋/實現SpeechView類的onTouchEvent(),並處理SpeechView實例本身的滑動。然後,您可以檢查SpeechView實例的屬性以瞭解哪一行已被刷新。

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

} 

此外,您可以通過一個GestureDetector到您SpeechListAdapter和飼料到SpeechView類最初創建時。然後,您可以將MotionEvents傳遞給它。

無論在哪種情況下,都要確保通過返回true來攔截觸摸事件。

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