表格锁栏的巧妙实现

最新项目上数据展示都是表格形式,手机的宽度不足于展示全面数据,首先是想用 HorizontalScrollView嵌套ListView展示,但是需要第一栏项目名称显示,所以这种方案只能放弃,最好选用两个ListView,一个显示项目名称,一个显示项目信息,联合滑动,右侧的list嵌套到HorizontalScrollView中,可以错觉的产生锁第一栏的情况,

布局

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.zhongjiao.tabdemo.sample1.MainActivity">

    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1">

        <ListView
            android:id="@+id/llistView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            >ListView>

    FrameLayout>

    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2">

        <com.test.tabdemo.sample1.MyView.MyHorizontalScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <ListView
                    android:id="@+id/RlistView"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    >
                ListView>
            LinearLayout>
        com.test.tabdemo.sample1.MyView.MyHorizontalScrollView>
    FrameLayout>

Activty代码



public class MainActivity extends AppCompatActivity {
    private ListView lListView,rListView;
    private List itmes;
    private MyAdapter mAdapter;
    private MAdapter mMyAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lListView = (ListView) findViewById(R.id.llistView);
        rListView = (ListView) findViewById(R.id.RlistView);
        initData();

    }

    @TargetApi(Build.VERSION_CODES.M)
    private void initData() {
        itmes = new ArrayList<>();

        for (int i = 0; i < 30; i++) {
            itmes.add("测试数据itme" + i);
        }

        mAdapter = new MyAdapter(itmes, this);
        mMyAdapter = new MAdapter(itmes, this);

        lListView.setAdapter(mAdapter);
        rListView.setAdapter(mMyAdapter);
        lListView.setOnScrollListener(new MyScrollListener(rListView));
        rListView.setOnScrollListener(new MyScrollListener(lListView));
    }

    class MyScrollListener implements AbsListView.OnScrollListener {
        private ListView mListView;
        public MyScrollListener(ListView listView) {
            mListView = listView;
        }

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_TOUCH_SCROLL) {
                View subView = view.getChildAt(0);
                if (subView != null) {
                    final int top = subView.getTop();
                    final int position = view.getFirstVisiblePosition();
                    mListView.setSelectionFromTop(position, top);
                }
            }

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            View subView = view.getChildAt(0);
            if (subView != null) {
                int top = subView.getTop();
                mListView.setSelectionFromTop(firstVisibleItem, top);
            }
        }
    }
}

自定义HorizontalScrollView

主要是去除ScrollView惯性,方便领导滑动查看 ,只要重写fling方法

@Override
    public void fling(int velocityX) {
        super.fling(velocityX/1000);
    }

你可能感兴趣的:(表格锁栏的巧妙实现)