0

我有以下的代碼,使ListView控件看起來像一個垂直畫廊作出這樣一個垂直畫廊一個ListView行爲

public class VerticalGallery extends ListView { 
    private View currentDisplayingView; 
    private int currentPosition; 

    public VerticalGallery(Context context, List<Page> pages) { 
      super(context); 

     setOnItemSelectedListener(new OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       currentDisplayingView = view; 
       currentPosition = position; 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 
      } 
     }); 

     setAdapter(new PageAdapter(context, pages)); 

     setCacheColorHint(Color.TRANSPARENT); 
    } 

    public boolean onTouchEvent(MotionEvent evt) { 
     if (currentDisplayingView != null && currentDisplayingView.onTouchEvent(evt)) 
      return true; 

     PageAdapter adapter = (PageAdapter) getAdapter(); 

     if (currentPosition == adapter.list.size() - 1) 
      return false; 

     // TODO: Handle events and swipe somewhere 
     return super.onTouchEvent(evt); 
    } 

    public class PageAdapter extends BaseAdapter { 
     private Context context; 
     private List<Page> list; 

     public PageAdapter(Context c, List<Page> pages) { 
      context = c; 
      list = pages; 
     } 

     public int getCount() { 
      return list.size(); 
     } 

     public Page getItem(int position) { 
      return list.get(position); 
     } 

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

     public View getView(int position, View convertView, ViewGroup parent) { 
      View view = getItem(position).generateView(context); 
      view.setLayoutParams(new ListView.LayoutParams(LayoutParams.MATCH_PARENT, 
        LayoutParams.MATCH_PARENT)); 
      return view; 
     } 
    }  
} 

但是,有一些行爲,我也需要模擬:

  • 集中化a View: 當一個新的視角來臨時,我需要將其集中在我的顯示器上。
  • 消防onItemSelected事件: 我需要這些,因爲我調度事件到當前視圖,並讓ListView滾動只有當currentView返回上的TouchEvent假的,我不需要完全ItemSelected事件,這可能是類似的東西。
  • 而另一個問題是,如果用戶向上滑動,我應該只翻譯一個視圖(不是根據手勢的速度而定)。

任何會讓我這樣做的組件也將是一個有用的答案。

編輯: 其實,我解決了這個問題,這個解決方案Using Animation to swipe views但我會繼續打開這個問題。

回答

0

正如我研究,我開發了這個自定義ScrollView做分頁。

public class ScrollViewVertical extends ScrollView {0} {0} {0} {0}私有布爾值分頁;

public ScrollViewVertical(Context context) { 
    super(context); 
} 

public boolean onTouchEvent(MotionEvent evt) { 
    if (evt.getAction() == MotionEvent.ACTION_UP) 
     if (isPaging()){ 
      centralizeContent(); 
      return true; 
     } 

    return super.onTouchEvent(evt); 
} 

private void centralizeContent() { 
    int currentY = getScrollY() + getHeight()/2; 
    ViewGroup content = (ViewGroup) getChildAt(0); 
    for (int i = 0; i < content.getChildCount(); i++) { 
     View child = content.getChildAt(i); 
     System.out.println(BoundsUtils.from(child)); 
     if (child.getTop() < currentY && child.getBottom() > currentY) { 
      smoothScrollTo(0, child.getTop()); 
      break; 
     } 
    } 
} 

}

+0

你可以給更多的代碼,並告訴如何使用ScrollViewVertical – pengwang

+0

該代碼缺少的唯一東西是分頁布爾標誌。 –

0

how to implement both ontouch and also onfling in a same listview?

閱讀本題答案接受約GestureListener類的實現。

將MyGestureListener類設置爲當前內部的類或將ListView對象傳遞給MyGestureListener類的構造函數。

在onFling()方法測量初始和最終觸摸之間的差異等

@Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     if(e1.getY() > e2.getY()) //1 
     { 
      int pos=(int)Math.floor(listView.getLastVisiblePosition/2);//2 
      if(pos < listView.getLastVisiblePosition()) 
         listView.smoothScrollToPosition(pos--);//3 
      else 
       listView.smoothScrollToPosition(listView.getLastVisiblePosition()); 
     } 
     else 
     { 
       int pos=(int)Math.floor(listView.getLastVisiblePosition/2); 
      if(pos < listView.getLastVisiblePosition && pos > listView.getFirstVisiblePosition()) 
         listView.smoothScrollToPosition(pos++); 
        else 
         listView.smoothScrollToPosition(listView.getFirstVisiblePosition()); 
     }     
    } 
  1. 如果e1.getY() > e2.getY()意味着用戶掃視-ED向下。差異e2.getY() - e1.getY()爲負數。

  2. 假設當前位置是中間位置。

  3. 向下移動一個位置。

此代碼未經測試,是對第三個問題的迴應。我只是把你的想法告訴你。

+0

沒有問題,但是當你有更多的時間,我會很高興聽到更多。 –