您当前的位置: 首页 > 

xiangzhihong8

暂无认证

  • 1浏览

    0关注

    1324博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

解决水平ListView在ScrollView中出现的滑动冲突

xiangzhihong8 发布时间:2016-02-18 09:31:30 ,浏览量:1

  解决的问题有两个:  1)实现水平滑动的ListView。重写AdapterView,上代码: 
Java代码   收藏代码
  1. package com.liucanwen.horizontallistview.view;  
  2.   
  3. import java.util.LinkedList;  
  4. import java.util.Queue;  
  5.   
  6. import android.content.Context;  
  7. import android.database.DataSetObserver;  
  8. import android.graphics.Rect;  
  9. import android.util.AttributeSet;  
  10. import android.view.GestureDetector;  
  11. import android.view.GestureDetector.OnGestureListener;  
  12. import android.view.View.MeasureSpec;  
  13. import android.view.MotionEvent;  
  14. import android.view.View;  
  15. import android.widget.AdapterView;  
  16. import android.widget.ListAdapter;  
  17. import android.widget.Scroller;  
  18.   
  19. /** 
  20.  * 重写ListView,以达到水平滑动 
  21.  */  
  22. public class HorizontalListView extends AdapterView  
  23. {  
  24.   
  25.     public boolean mAlwaysOverrideTouch = true;  
  26.     protected ListAdapter mAdapter;  
  27.     private int mLeftViewIndex = -1;  
  28.     private int mRightViewIndex = 0;  
  29.     protected int mCurrentX;  
  30.     protected int mNextX;  
  31.     private int mMaxX = Integer.MAX_VALUE;  
  32.     private int mDisplayOffset = 0;  
  33.     protected Scroller mScroller;  
  34.     private GestureDetector mGesture;  
  35.     private Queue mRemovedViewQueue = new LinkedList();  
  36.     private OnItemSelectedListener mOnItemSelected;  
  37.     private OnItemClickListener mOnItemClicked;  
  38.     private OnItemLongClickListener mOnItemLongClicked;  
  39.     private boolean mDataChanged = false;  
  40.   
  41.     public HorizontalListView(Context context, AttributeSet attrs)  
  42.     {  
  43.         super(context, attrs);  
  44.         initView();  
  45.     }  
  46.   
  47.     private synchronized void initView()  
  48.     {  
  49.         mLeftViewIndex = -1;  
  50.         mRightViewIndex = 0;  
  51.         mDisplayOffset = 0;  
  52.         mCurrentX = 0;  
  53.         mNextX = 0;  
  54.         mMaxX = Integer.MAX_VALUE;  
  55.         mScroller = new Scroller(getContext());  
  56.         mGesture = new GestureDetector(getContext(), mOnGesture);  
  57.     }  
  58.   
  59.     @Override  
  60.     public void setOnItemSelectedListener(  
  61.             AdapterView.OnItemSelectedListener listener)  
  62.     {  
  63.         mOnItemSelected = listener;  
  64.     }  
  65.   
  66.     @Override  
  67.     public void setOnItemClickListener(AdapterView.OnItemClickListener listener)  
  68.     {  
  69.         mOnItemClicked = listener;  
  70.     }  
  71.   
  72.     @Override  
  73.     public void setOnItemLongClickListener(  
  74.             AdapterView.OnItemLongClickListener listener)  
  75.     {  
  76.         mOnItemLongClicked = listener;  
  77.     }  
  78.   
  79.     private DataSetObserver mDataObserver = new DataSetObserver()  
  80.     {  
  81.   
  82.         @Override  
  83.         public void onChanged()  
  84.         {  
  85.             synchronized (HorizontalListView.this)  
  86.             {  
  87.                 mDataChanged = true;  
  88.             }  
  89.             invalidate();  
  90.             requestLayout();  
  91.         }  
  92.   
  93.         @Override  
  94.         public void onInvalidated()  
  95.         {  
  96.             reset();  
  97.             invalidate();  
  98.             requestLayout();  
  99.         }  
  100.   
  101.     };  
  102.   
  103.     @Override  
  104.     public ListAdapter getAdapter()  
  105.     {  
  106.         return mAdapter;  
  107.     }  
  108.   
  109.     @Override  
  110.     public View getSelectedView()  
  111.     {  
  112.         // TODO: implement  
  113.         return null;  
  114.     }  
  115.   
  116.     @Override  
  117.     public void setAdapter(ListAdapter adapter)  
  118.     {  
  119.         if (mAdapter != null)  
  120.         {  
  121.             mAdapter.unregisterDataSetObserver(mDataObserver);  
  122.         }  
  123.         mAdapter = adapter;  
  124.         mAdapter.registerDataSetObserver(mDataObserver);  
  125.         reset();  
  126.     }  
  127.   
  128.     private synchronized void reset()  
  129.     {  
  130.         initView();  
  131.         removeAllViewsInLayout();  
  132.         requestLayout();  
  133.     }  
  134.   
  135.     @Override  
  136.     public void setSelection(int position)  
  137.     {  
  138.         // TODO: implement  
  139.     }  
  140.   
  141.     private void addAndMeasureChild(final View child, int viewPos)  
  142.     {  
  143.         LayoutParams params = child.getLayoutParams();  
  144.         if (params == null)  
  145.         {  
  146.             params = new LayoutParams(LayoutParams.FILL_PARENT,  
  147.                     LayoutParams.FILL_PARENT);  
  148.         }  
  149.   
  150.         addViewInLayout(child, viewPos, params, true);  
  151.         child.measure(  
  152.                 MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST),  
  153.                 MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST));  
  154.     }  
  155.   
  156.     @Override  
  157.     protected synchronized void onLayout(boolean changed, int left, int top,  
  158.             int right, int bottom)  
  159.     {  
  160.         super.onLayout(changed, left, top, right, bottom);  
  161.   
  162.         if (mAdapter == null)  
  163.         {  
  164.             return;  
  165.         }  
  166.   
  167.         if (mDataChanged)  
  168.         {  
  169.             int oldCurrentX = mCurrentX;  
  170.             initView();  
  171.             removeAllViewsInLayout();  
  172.             mNextX = oldCurrentX;  
  173.             mDataChanged = false;  
  174.         }  
  175.   
  176.         if (mScroller.computeScrollOffset())  
  177.         {  
  178.             int scrollx = mScroller.getCurrX();  
  179.             mNextX = scrollx;  
  180.         }  
  181.   
  182.         if (mNextX = mMaxX)  
  183.         {  
  184.             mNextX = mMaxX;  
  185.             mScroller.forceFinished(true);  
  186.         }  
  187.   
  188.         int dx = mCurrentX - mNextX;  
  189.   
  190.         removeNonVisibleItems(dx);  
  191.         fillList(dx);  
  192.         positionItems(dx);  
  193.   
  194.         mCurrentX = mNextX;  
  195.   
  196.         if (!mScroller.isFinished())  
  197.         {  
  198.             post(new Runnable()  
  199.             {  
  200.                 @Override  
  201.                 public void run()  
  202.                 {  
  203.                     requestLayout();  
  204.                 }  
  205.             });  
  206.   
  207.         }  
  208.     }  
  209.   
  210.     private void fillList(final int dx)  
  211.     {  
  212.         int edge = 0;  
  213.         View child = getChildAt(getChildCount() - 1);  
  214.         if (child != null)  
  215.         {  
  216.             edge = child.getRight();  
  217.         }  
  218.         fillListRight(edge, dx);  
  219.   
  220.         edge = 0;  
  221.         child = getChildAt(0);  
  222.         if (child != null)  
  223.         {  
  224.             edge = child.getLeft();  
  225.         }  
  226.         fillListLeft(edge, dx);  
  227.   
  228.     }  
  229.   
  230.     private void fillListRight(int rightEdge, final int dx)  
  231.     {  
  232.         while (rightEdge + dx  0)  
  233.         {  
  234.             mDisplayOffset += dx;  
  235.             int left = mDisplayOffset;  
  236.             for (int i = 0; i 
关注
打赏
1482932726
查看更多评论
立即登录/注册

微信扫码登录

0.0533s