2012-09-20 135 views
2

我已經開發了我使用水平ListView顯示的內容(其實這個內容適用於頭)。我已經用了向右滾動兩個按鈕,其中一個應用程序,並留下看到更多content.I」米糊塗了這一點,任何建議我如何解決這個問題? 感謝 Horizo​​ntalListView的ListView的滾動按鈕上點擊

代碼

public class HorizontialListView extends AdapterView<ListAdapter> { 

    public boolean mAlwaysOverrideTouch = true; 
    protected ListAdapter mAdapter; 
    private int mLeftViewIndex = -1; 
    private int mRightViewIndex = 0; 
    protected int mCurrentX; 
    protected int mNextX; 
    private int mMaxX = Integer.MAX_VALUE; 
    private int mDisplayOffset = 0; 
    protected Scroller mScroller; 
    private GestureDetector mGesture; 
    private Queue<View> mRemovedViewQueue = new LinkedList<View>(); 
    private OnItemSelectedListener mOnItemSelected; 
    private OnItemClickListener mOnItemClicked; 
    private boolean mDataChanged = false; 

    public HorizontialListView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initView(); 
    } 

    private synchronized void initView() { 
     mLeftViewIndex = -1; 
     mRightViewIndex = 0; 
     mDisplayOffset = 0; 
     mCurrentX = 0; 
     mNextX = 0; 
     mMaxX = Integer.MAX_VALUE; 
     mScroller = new Scroller(getContext()); 
     mGesture = new GestureDetector(getContext(), mOnGesture); 
    } 

    @Override 
    public void setOnItemSelectedListener(
      AdapterView.OnItemSelectedListener listener) { 
     mOnItemSelected = listener; 
    } 

    @Override 
    public void setOnItemClickListener(AdapterView.OnItemClickListener listener) { 
     mOnItemClicked = listener; 
    } 

    private DataSetObserver mDataObserver = new DataSetObserver() { 

     @Override 
     public void onChanged() { 
      synchronized (HorizontialListView.this) { 
       mDataChanged = true; 
      } 
      invalidate(); 
      requestLayout(); 
     } 

     @Override 
     public void onInvalidated() { 
      reset(); 
      invalidate(); 
      requestLayout(); 
     } 

    }; 

    @Override 
    public ListAdapter getAdapter() { 
     return mAdapter; 
    } 

    @Override 
    public View getSelectedView() { 
     // TODO: implement 
     return null; 
    } 

    @Override 
    public void setAdapter(ListAdapter adapter) { 
     if (mAdapter != null) { 
      mAdapter.unregisterDataSetObserver(mDataObserver); 
     } 
     mAdapter = adapter; 
     mAdapter.registerDataSetObserver(mDataObserver); 
     reset(); 
    } 

    private synchronized void reset() { 
     initView(); 
     removeAllViewsInLayout(); 
     requestLayout(); 
    } 

    @Override 
    public void setSelection(int position) { 
     // TODO: implement 
    } 

    private void addAndMeasureChild(final View child, int viewPos) { 
     LayoutParams params = child.getLayoutParams(); 
     if (params == null) { 
      params = new LayoutParams(LayoutParams.FILL_PARENT, 
        LayoutParams.FILL_PARENT); 
     } 

     addViewInLayout(child, viewPos, params, true); 
     child.measure(
       MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), 
       MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); 
    } 

    @Override 
    protected synchronized void onLayout(boolean changed, int left, int top, 
      int right, int bottom) { 
     super.onLayout(changed, left, top, right, bottom); 

     if (mAdapter == null) { 
      return; 
     } 

     if (mDataChanged) { 
      int oldCurrentX = mCurrentX; 
      initView(); 
      removeAllViewsInLayout(); 
      mNextX = oldCurrentX; 
      mDataChanged = false; 
     } 

     if (mScroller.computeScrollOffset()) { 
      int scrollx = mScroller.getCurrX(); 
      mNextX = scrollx; 
     } 

     if (mNextX < 0) { 
      mNextX = 0; 
      mScroller.forceFinished(true); 
     } 
     if (mNextX > mMaxX) { 
      mNextX = mMaxX; 
      mScroller.forceFinished(true); 
     } 

     int dx = mCurrentX - mNextX; 

     removeNonVisibleItems(dx); 
     fillList(dx); 
     positionItems(dx); 

     mCurrentX = mNextX; 

     if (!mScroller.isFinished()) { 
      post(new Runnable() { 
       @Override 
       public void run() { 
        requestLayout(); 
       } 
      }); 

     } 
    } 

    private void fillList(final int dx) { 
     int edge = 0; 
     View child = getChildAt(getChildCount() - 1); 
     if (child != null) { 
      edge = child.getRight(); 
     } 
     fillListRight(edge, dx); 

     edge = 0; 
     child = getChildAt(0); 
     if (child != null) { 
      edge = child.getLeft(); 
     } 
     fillListLeft(edge, dx); 

    } 

    private void fillListRight(int rightEdge, final int dx) { 
     while (rightEdge + dx < getWidth() 
       && mRightViewIndex < mAdapter.getCount()) { 

      View child = mAdapter.getView(mRightViewIndex, 
        mRemovedViewQueue.poll(), this); 
      addAndMeasureChild(child, -1); 
      rightEdge += child.getMeasuredWidth(); 

      if (mRightViewIndex == mAdapter.getCount() - 1) { 
       mMaxX = mCurrentX + rightEdge - getWidth(); 
      } 
      mRightViewIndex++; 
     } 

    } 

    private void fillListLeft(int leftEdge, final int dx) { 
     while (leftEdge + dx > 0 && mLeftViewIndex >= 0) { 
      View child = mAdapter.getView(mLeftViewIndex, 
        mRemovedViewQueue.poll(), this); 
      addAndMeasureChild(child, 0); 
      leftEdge -= child.getMeasuredWidth(); 
      mLeftViewIndex--; 
      mDisplayOffset -= child.getMeasuredWidth(); 
     } 
    } 

    private void removeNonVisibleItems(final int dx) { 
     View child = getChildAt(0); 
     while (child != null && child.getRight() + dx <= 0) { 
      mDisplayOffset += child.getMeasuredWidth(); 
      mRemovedViewQueue.offer(child); 
      removeViewInLayout(child); 
      mLeftViewIndex++; 
      child = getChildAt(0); 

     } 

     child = getChildAt(getChildCount() - 1); 
     while (child != null && child.getLeft() + dx >= getWidth()) { 
      mRemovedViewQueue.offer(child); 
      removeViewInLayout(child); 
      mRightViewIndex--; 
      child = getChildAt(getChildCount() - 1); 
     } 
    } 

    private void positionItems(final int dx) { 
     if (getChildCount() > 0) { 
      mDisplayOffset += dx; 
      int left = mDisplayOffset; 
      for (int i = 0; i < getChildCount(); i++) { 
       View child = getChildAt(i); 
       int childWidth = child.getMeasuredWidth(); 
       child.layout(left, 0, left + childWidth, 
         child.getMeasuredHeight()); 
       left += childWidth; 
      } 
     } 
    } 

    public synchronized void scrollTo(int x) { 
     mScroller.startScroll(mNextX, 0, x - mNextX, 0); 
     requestLayout(); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     boolean handled = mGesture.onTouchEvent(ev); 
     return handled; 
    } 

    protected boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 
     synchronized (HorizontialListView.this) { 
      mScroller.fling(mNextX, 0, (int) -velocityX, 0, 0, mMaxX, 0, 0); 
     } 
     requestLayout(); 

     return true; 
    } 

    protected boolean onDown(MotionEvent e) { 
     mScroller.forceFinished(true); 
     return true; 
    } 

    private OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() { 

     @Override 
     public boolean onDown(MotionEvent e) { 
      return HorizontialListView.this.onDown(e); 
     } 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
       float velocityY) { 
      return HorizontialListView.this.onFling(e1, e2, velocityX, 
        velocityY); 
     } 

     @Override 
     public boolean onScroll(MotionEvent e1, MotionEvent e2, 
       float distanceX, float distanceY) { 

      synchronized (HorizontialListView.this) { 
       mNextX += (int) distanceX; 
      } 
      requestLayout(); 

      return true; 
     } 

     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
      Rect viewRect = new Rect(); 
      for (int i = 0; i < getChildCount(); i++) { 
       View child = getChildAt(i); 
       int left = child.getLeft(); 
       int right = child.getRight(); 
       int top = child.getTop(); 
       int bottom = child.getBottom(); 
       viewRect.set(left, top, right, bottom); 
       if (viewRect.contains((int) e.getX(), (int) e.getY())) { 
        if (mOnItemClicked != null) { 
         mOnItemClicked.onItemClick(HorizontialListView.this, 
           child, mLeftViewIndex + 1 + i, 
           mAdapter.getItemId(mLeftViewIndex + 1 + i)); 
        } 
        if (mOnItemSelected != null) { 
         mOnItemSelected.onItemSelected(
           HorizontialListView.this, child, mLeftViewIndex 
             + 1 + i, 
           mAdapter.getItemId(mLeftViewIndex + 1 + i)); 
        } 
        break; 
       } 

      } 
      return true; 
     } 

    }; 

} 

Xml代碼

<com.ui.HorizontialListView 
      android:id="@+id/listview" 
      android:layout_width="fill_parent" 
      android:layout_height="30dp" 
      android:layout_centerInParent="true" 
      android:layout_toLeftOf="@+id/rightcorv" 
      android:layout_toRightOf="@+id/leftcorv" /> 
+0

你所說的 「水平的ListView」 是什麼意思? – abecker

+0

默認列表視圖是垂直的。我已經定製它,使這個水平對於我的要求 – Dilip

+0

這不是簡單的使用一個畫廊? – abecker

回答

0

你可能想使用爲setSelection()方法,而不是滾動由每次100個像素列表。當您向下滾動時增加選擇並在滾動時遞減選擇。這將確保正確的項目被點擊。希望這可以幫助。

+0

感謝@google,U可以用例 – Dilip

+0

闡述我有,但現在我不have.i完成B48個月左右。 – Google

1

試試這個代碼,這可能會幫助你。

int index = mList.getFirstVisiblePosition(); 
View view = mList.getChildAt(0); 
int top = (view == null) ? 0 : view.getTop(); 

// restore 
mList.setSelectionFromTop(index, top); 
0

對於以前的,請參閱BtnPrev和下一參考btnNext R.id.lv是您的列表視圖中的ID。

Button btnPrev = (Button) findViewById(R.id.button1); 
    btnPrev.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      ListView lv = (ListView) findViewById(R.id.lv); 

      int firstVisibleItem = lv.getFirstVisiblePosition(); 
      int lastVisibleCount = lv.getLastVisiblePosition(); 
      if (firstVisibleItem != 0) { 
       int count1 = firstVisibleItem 
         - (lastVisibleCount - firstVisibleItem); 
       if (count1 < 0) { 
        lv.setSelection(0); 
       } 

       else { 
        lv.setSelection(count1); 
       } 
      } 

     } 
    }); 

    Button btnNext = (Button) findViewById(R.id.button2); 
    btnNext.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      ListView lv = (ListView) findViewById(R.id.lv); 
      int count = lv.getCount(); 
      int firstVisibleItem = lv.getFirstVisiblePosition(); 
      int lastVisibleCount = lv.getLastVisiblePosition(); 
      if (lastVisibleCount != count) { 
       int count1 = lastVisibleCount 
         + (lastVisibleCount - firstVisibleItem); 
       if (count1 > count) { 
        lv.setSelection(count); 
       } else { 
        lv.setSelection(count1); 
       } 
      } 

     } 
    }); 
+0

感謝@Hitesh的回覆,但它的不工作。看看我的代碼,我用這個爲Horizo​​ntalListView – Dilip

+0

你可以發佈你的代碼水平列表視圖(xml和java代碼,你用來定製) –

+0

有看上面我的代碼 – Dilip

2
private void startScroll(AbsListView view) 
{ 
    try 
    { 
     Field field = android.widget.AbsListView.class.getDeclaredField("mFlingRunnable"); 
     field.setAccessible(true); 
     Object flingRunnable = field.get(view); 
     if (flingRunnable != null) 
     { 
      Method method = Class.forName("android.widget.AbsListView$FlingRunnable").getDeclaredMethod("endFling"); 
      method.setAccessible(true); 
      method.invoke(flingRunnable); 
     } 
    } 
    catch (Exception e) {} 
} 

Just call startScroll(myListView); when you need to start scroll.