横向滑动的listview效果的实现方法,scrollview嵌套水平滑动的listview卡顿的解决方法

很多时候,界面需要实现横向滑动的listview效果。网络上有一种方法,自定义了HorizontalListView,用法同正常的listview,可实现水平滑动效果。

但是如果一个界面 为垂直滑动的scrollview嵌套水平滑动的listview的时候,滑动水平listview的时候,会很卡。我最近就遇到了这样的问题,一直把思路放在监听水平和垂直滑动手势,想实现滑动角度小于45的时候 垂直的scrollview 滑动效果被禁止。但是一直没有研究出来。

于是一个偶然的机会,灵光一闪,想到用HorizontalScrollView嵌套gridview,实现水平滑动的效果。果真效果很棒哦。没有卡顿的现象出现。

方法如下:

布局:

<HorizontalScrollView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:scrollbars="none" >
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >
                <GridView
                    android:id="@+id/server_details_content_view_product_gv"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" >
                </GridView>
            </LinearLayout>
        </HorizontalScrollView>


代码中要设置gridview的属性,否则没有滑动效果

/** 设置GirdView参数,length一般为100到230不等,自己设置适配吧。size为列表的大小*/
private void setGridView(GridView gv, int length, int size) {


DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
float density = dm.density;
int gridviewWidth = (int) (size * (length + 4) * density);
int itemWidth = (int) (length * density);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
gridviewWidth, LinearLayout.LayoutParams.FILL_PARENT);
gv.setLayoutParams(params); // 设置GirdView布局参数,横向布局的关键
gv.setColumnWidth(itemWidth); // 设置列表项宽
gv.setHorizontalSpacing(5); // 设置列表项水平间距
gv.setStretchMode(GridView.NO_STRETCH);
gv.setNumColumns(size); // 设置列数量=列表集合数


}

设置适配器的时候。适配器的写法同正常的gridview的适配器,再次不再附代码。如有疑问可以留言哦。

setGridView(vStepsGv, 230,serviceContentList.size());
stepsAdapter = new ServerStepsListAdapter(this, serviceContentList);
vStepsGv.setAdapter(stepsAdapter);

另外如果不需要外层嵌套垂直滑动的scrollview,这个自定义的listview还是不错的啦!附代码:(用法同正常的listview,如有疑问可以留言哦)

/**
 * 左右滑动的listview
 * 
 * @author lunizhu
 * 
 */
public class HorizontalListView 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 OnItemLongClickListener mOnItemLongClicked;
private boolean mDataChanged = false;


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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值