
- package com.liucanwen.horizontallistview.view;
- import java.util.LinkedList;
- import java.util.Queue;
- import android.content.Context;
- import android.database.DataSetObserver;
- import android.graphics.Rect;
- import android.util.AttributeSet;
- import android.view.GestureDetector;
- import android.view.GestureDetector.OnGestureListener;
- import android.view.View.MeasureSpec;
- import android.view.MotionEvent;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.ListAdapter;
- import android.widget.Scroller;
- /**
- * 重写ListView,以达到水平滑动
- */
- public class HorizontalListView extends AdapterView
- {
- 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 mRemovedViewQueue = new LinkedList();
- private OnItemSelectedListener mOnItemSelected;
- private OnItemClickListener mOnItemClicked;
- private OnItemLongClickListener mOnItemLongClicked;
- private boolean mDataChanged = false;
- public HorizontalListView(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;
- }
- @Override
- public void setOnItemLongClickListener(
- AdapterView.OnItemLongClickListener listener)
- {
- mOnItemLongClicked = listener;
- }
- private DataSetObserver mDataObserver = new DataSetObserver()
- {
- @Override
- public void onChanged()
- {
- synchronized (HorizontalListView.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 = 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 0)
- {
- mDisplayOffset += dx;
- int left = mDisplayOffset;
- for (int i = 0; i
关注打赏
立即登录/注册


微信扫码登录