在ScrollView中滚动ListView的问题

时间:2010-10-24 19:27:37

标签: android

这是概念上的场景(不包括linearlayouts)

ScrollView
  Button
  Checkboxes
  Spinner
  ListView (full-size, non-scrolling)
AdMob advert

即。滚动窗格,其顶部有过滤UI,后跟结果,但广告必须始终保持可见,向下滚动时,过滤器UI必须滚动,为结果留出最大空间。

我知道ScrollView中的ListView存在问题,但对我而言,它在很多方面都运行良好(我正在修复ListView的长度以阻止它崩溃)。因此屏幕滚动得很好,广告保持在底部,看起来很不错。

但是我看到的问题是,莫名其妙地,当活动打开时,ScrollView向下滚动了一下,因此ListView位于屏幕的顶部。我假设这是一个默认行为,所以我开始尝试强制ScrollView的滚动位置到顶部,但我尝试了各种方法,看不到任何效果:

scrollview.scrollTo(0, 1000/-1000);
scrollview.smoothScrollBy(0, 1000/-1000);
scrollview.fullScroll(View.FOCUS_UP);

有没有办法强制ScrollView从顶部的滚动位置开始?

如果没有,我怎么能有一个不会从底部滚动的广告,而是一个总是滚动到顶部的过滤器UI?使用ListView似乎有些过分,因为我不需要滚动,但它确实提供了很多好处,所以最好避免从头开始并自己渲染所有内容。

6 个答案:

答案 0 :(得分:1)

使用以下方法享受!

    private void setListViewScrollable(final ListView list) {
    list.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            listViewTouchAction = event.getAction();
            if (listViewTouchAction == MotionEvent.ACTION_MOVE)
            {
                list.scrollBy(0, 1);
            }
            return false;
        }
    });
    list.setOnScrollListener(new OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView view,
                int scrollState) {
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            if (listViewTouchAction == MotionEvent.ACTION_MOVE)
            {
                list.scrollBy(0, -1);
            }
        }
    });
}

listViewTouchAction是一个全局整数值。 如果你可以替换

list.scrollBy(0, 1);

请与我们分享。

答案 1 :(得分:0)

如果您不滚动,为什么使用列表视图?为什么你不能只使用线性布局或更适合这种情况的东西?你提到了一个过滤器,你可以很容易地推出自己的过滤器,特别是因为你的列表视图中只有一些项目。

答案 2 :(得分:0)

使用ListView之外的其他东西,你可以动态生成linearLayouts来显示你想要的数据。你永远不应该在scrollView中使用listview,当你滚动,滚动的内容,列表视图或滚动视图时,它不会因为一个简单的原因而起作用。谷歌的一些人已表示不会这样做。

答案 3 :(得分:0)

我遇到了ScrollView开始略微向下滚动的问题,解决方案是发布一个runnable,它调用animateTo(0,0)方法让列表滚动到顶部。我发现这只能使用anitmatTo(0,0)scrollTo(0,0)似乎不起作用。

有些事情:

mListView.post(new Runnable(){ public void run() { mListView.animateScrollTo(0,0) });

现在每个人都已经说过你不应该在ScrollView中做整个ListView,但这可能是你解决问题的方法。

答案 4 :(得分:0)

我有:

ScrollView
 TextView
 Button
 TextView
 ListView

这项工作对我有好处:

scrollView.smoothScrollBy(0, 0);        

没有此视图从listview的位置开始,之后从顶部开始

答案 5 :(得分:-1)

此问题的解决方案是将请求重点放在ScrollView顶部的对象上。例如,您可以使用包裹按钮的表格布局并请求焦点到表格布局(如果您关注按钮,它将更改其颜色)。

// onCreate method
TableLayout tablelayout = (TableLayout) findViewById(R.id.tablelayout);
tablelayout.setFocusableInTouchMode(true);
tablelayout.requestFocus();