水平和垂直滚动GridView Android

时间:2019-02-12 05:47:20

标签: android gridview scroll horizontal-scrolling vertical-scrolling

我正在使用GridView创建组件以创建类似于Excel的表。在这里,我首先创建2x2网格,然后在用户单击按钮时创建2x2网格,然后添加额外的行和列。

这就是我要添加新列的步骤:-

int numColumns = GVParticipantTable.getNumColumns() + 1;
                double numRows = Math.ceil((double) GVParticipantTable.getCount() / (double) GVParticipantTable.getNumColumns());
                int totalItems = (int) numRows * numColumns;

                if (participantDataList.size() > 4)
                {
                    totalItems = totalItems - participantDataList.size();
                }
                for (int i = 0; i < totalItems; i++)
                {
                    participantDataList.add("");

                }

                GVParticipantTable.setNumColumns(numColumns);
                mAdapterParticipantTable.notifyDataSetChanged();

这很好用,并添加了一个额外的列。问题在于,添加列时,先前的列会缩小以容纳新列,从而使每次添加新列时这些列看起来都较小。我想一次只在屏幕上显示2列,然后让用户水平向前滚动以查看更多列。现在,网格只能垂直滚动。同样,我希望在添加新行时发​​生这种情况,用户应该能够垂直滚动以查看更多行。

1 个答案:

答案 0 :(得分:0)

据我所知,您永远不应该将Horizo​​ntalScrollView与ListView一起使用,因为ListView负责其自身的滚动。最重要的是,这样做会挫败ListView处理大型列表的所有重要优化,因为它有效地迫使ListView显示其整个项目列表,以填充Horizo​​ntalScrollView提供的无限容器。

http://developer.android.com/reference/android/widget/HorizontalScrollView.html

由于您可能被迫使用二维滚动视图,因此您可以考虑使用以下内容:blog.gorges.us/2010/06/android-two-dimensional-scrollview/的Internet存档

我没有用过,但这可能是一个合理的方法。

也许可以尝试通过将其添加到XML文件和JAVA中

<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scrollHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ScrollView 
        android:id="@+id/scrollVertical"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" >

        //WateverViewYouWant

    </ScrollView>
</HorizontalScrollView>

以及onCreate / onCreateView上的代码

final HorizontalScrollView hScroll = (HorizontalScrollView) value.findViewById(R.id.scrollHorizontal);
    final ScrollView vScroll = (ScrollView) value.findViewById(R.id.scrollVertical);
    vScroll.setOnTouchListener(new View.OnTouchListener() { //inner scroll listener         
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return false;
        }
    });
    hScroll.setOnTouchListener(new View.OnTouchListener() { //outer scroll listener         
        private float mx, my, curX, curY;
        private boolean started = false;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            curX = event.getX();
            curY = event.getY();
            int dx = (int) (mx - curX);
            int dy = (int) (my - curY);
            switch (event.getAction()) {
                case MotionEvent.ACTION_MOVE:
                    if (started) {
                        vScroll.scrollBy(0, dy);
                        hScroll.scrollBy(dx, 0);
                    } else {
                        started = true;
                    }
                    mx = curX;
                    my = curY;
                    break;
                case MotionEvent.ACTION_UP: 
                    vScroll.scrollBy(0, dy);
                    hScroll.scrollBy(dx, 0);
                    started = false;
                    break;
            }
            return true;
        }
    });