AndroidUI之HorizontalScrollView联动,实现表格样式

本文探讨如何利用HorizontalScrollView实现ListView的上下左右滑动,通过重写控件和绑定数据源,构建无限制宽度的表格布局。步骤包括重写HorizontalScrollView,解决滑动冲突,设置SyncHorizontalScrollView,设计页面结构以及填充数据。
摘要由CSDN通过智能技术生成

       本篇文章主要讲述如何解决让listview上下左右滑动,并且宽度无限制。这就要使用两个HorizontalScrollView联动来实现这个功能。

        HorizontalScrollView实际是一个FrameLayout,一般里面只放置LinearLayout子控件。如果要让listview上下左右滑动,就必须重写listview。

        案例如下:

        1、先重写HorizontalScrollView使得两个HorizontalScrollView可以同步滚动

        

public class SyncHorizontalScrollView extends HorizontalScrollView {

    private View mView;

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

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

    public SyncHorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (mView != null) {
            mView.scrollTo(l, t);
        }
    }

    public void setSrollView(View view) {
        mView = view;
    }
}

        2、重写listview,解决与上层控件滑动冲突

public class NoscrollListView extends ListView {

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

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

    public NoscrollListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

        3、绑定SyncHorizontalScorllView

    

NoscrollListView lv_Data;//主列表
NoscrollListView lv_left;//左侧列表
SyncHorizontalScollView mHeaderHorizontal, mDataHorizontal;
lv_Data = findViewById(R.id.lv_data);
lv_left = findViewById(R.id.lv_left);
mHeaderHorizontal = findViewById(R.id.header_horizontal);
mDataHorizontal = findViewById(R.id.data_horizontal);
mHeaderHorizontal.setScrollView(mDataHorizontal);
mDataHorizontal.setScrollView(mHeaderHorizontal);

        4、编写主要页面(页面主体分为两部分,一部分为上部的标题列,另一部分是下部的数据表,其中数据表又分为左侧不可左右滑动的列,和右侧可上下左右滑动的数据列表)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <!--标题列布局-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@android:color/holo_blue_dark"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:orientation="vertical">

            <TextView
                android:layout_width="100dp"
                android:layout_height="match_parent"
                android:gravity="center"
                android:text="1"
                android:textSize="25sp" />
        </LinearLayout>

        <View
            android:layout_width="1px"
            android:layout_height="match_parent"
            android:background="@android:color/black" />
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值