ListView到ScrollView(pull-to-refresh)

时间:2013-11-20 14:34:48

标签: android listview scrollview pull-to-refresh

我必须添加pull-to-refresh功能来刷新主屏幕上的信息。这是我的屏幕UI方案(红色区域应该处理拉动):

enter image description here

我使用ready solution进行pull-to-refresh。由于文档,我的红色布局应该是这些类之一:

ListView
ExpandableListView
GridView
WebView
ScrollView
HorizontalScrollView
ViewPager

但是我的屏幕上有ListView,所以我无法使用ScrollView作为红色布局。我坚持这个问题。可以在iOS中将UITableView用于UIScrollView,但在Android中我不知道在这种情况下该怎么做。

任何帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:0)

为什么不用LinearLayout替换listview,然后你可以使用ScrollView? 您只需要为linearlayout中的项目创建布局,然后使用以下内容添加它们:

LinearLayout layout = (LinearLayout)findViewById(R.id.MyListLayout);
for (int i=0; i<list.size(); i++) {
  Item item = list.get(i);
  View view = inflater.inflate(R.layout.MyRowLayout, null);
  Textview myTextView = view.findViewById(R.id.MyTextView);
  myTextView.setText(item.getString());
  list.addView(vi);
}

答案 1 :(得分:0)

拉动刷新是水平还是垂直?

如果它是水平的,使用Horizo​​ntalScrollView(也可以使用ViewPager),然后在其中放置一个Table?Layout。

如果它是水平的,那么,我不认为我喜欢那种设计(拉动刷新区域应该只是ListView),但我相信有一些方法可以使用ListView而不需要内部滚动您可以依靠父ScrollView进行滚动,但我需要检查旧问题的代码以“记住”如何执行此操作。

答案 2 :(得分:0)

我已经解决了这个问题,但忘了写一下:)

我的layout.xml文件如下所示:

   <com.handmark.pulltorefresh.library.PullToRefreshScrollView
        android:id="@+id/home_info_pulltorefresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true" >

        <LinearLayout
            android:id="@+id/home_info_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/white_background"
            android:baselineAligned="false"
            android:orientation="horizontal" >

            <LinearLayout
                android:id="@+id/charts_container"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="2"
                android:orientation="vertical"
                android:paddingRight="5dp" >

                <FrameLayout
                    android:id="@+id/frame_container_chart_top"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1" />

                <FrameLayout
                    android:id="@+id/frame_container_chart_bottom"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1" />
            </LinearLayout>

            <FrameLayout
                android:id="@+id/frame_container_right"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1" />
        </LinearLayout>
    </com.handmark.pulltorefresh.library.PullToRefreshScrollView> 

android:fillViewport="true"用于拉伸其内容以填充视口(滚动match_parent的高度)

我以编程方式添加包含ListView的Fragment(R.layout.frame_container_right Fragment resource ID)

一切正常,但当我尝试向下滚动ListView时,我的ScrollView开始滚动。滚动ListView向上工作正常。另外我注意到,如果我点击ListView,向左或向右移动手指,然后尝试向下滚动,触摸事件不会从ListView传输到ScrollView,我得到预期的行为。所以我决定以编程方式模拟这种情况:

mListViewReviews.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    long startTime = SystemClock.uptimeMillis();
                    long duration = 1;
                    MotionEvent e = MotionEvent.obtain(startTime, startTime + duration, MotionEvent.ACTION_MOVE, event
                            .getX(), event.getY() + 10, 0);
                    MotionEvent ev = MotionEvent.obtain(startTime + duration, startTime + duration * 2,
                            MotionEvent.ACTION_MOVE, event.getX(), event.getY() + 20, 0);

                    v.dispatchTouchEvent(e);
                    v.dispatchTouchEvent(ev);

                }
                return false;
            }
        });

因此,我已经使用适当的单元重用和工作拉动刷新逻辑工作ListView。谢谢!