如何滚动到长ScrollView布局的顶部?

Gle*_*enn 156 android listview scrollview

对于我的部分应用,会向用户显示一个名称列表,并要求他们按照自己的意愿对其进行分组.

(注意,ListView代码是从Android视图教程中逐字复制的.我还没有根据我的需要对其进行定制,我只想弄清楚如何使其工作.)

基本布局是一个LinearLayout,包含一个ScrollView(在下面的代码中称为"groupsScrollView"),包含一个RelativeLayout.我有一些按钮和文本,然后是我的ListView,它显示了名称列表.所有这一切都高于可见屏幕区域,因此允许用户垂直滚动以查看所有内容.

这一切都很漂亮,除非页面加载时总是预先滚动到我的ListView顶部 - 在页面中间.我创建的文本和按钮告诉用户该做什么是不可见的.

我可以抓住屏幕并向上滚动,这很好用,但我希望屏幕加载已经滚动到顶部.用户不必向上滚动以查看新加载页面的顶部.但我尝试以编程方式滚动到屏幕顶部的所有内容都失败了.

这是我的onCreate方法:

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.groups);

    mainScrollView = (ScrollView)findViewById(R.id.groupsScrollView);

    //get the Bundle out of the Intent...
    Bundle extras = getIntent().getExtras();
    mNames = extras.getStringArray("mNames");

    setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mNames));

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);

    //This is the line I'm having issues with
    mainScrollView.pageScroll(View.FOCUS_UP);

    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
          // When clicked, show a toast with the TextView text
          Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
              Toast.LENGTH_SHORT).show();
        }
      });
}
Run Code Online (Sandbox Code Playgroud)

行"mainScrollView.pageScroll(View.FOCUS_UP);是问题.它不会导致错误,但似乎没有做任何事情.我尝试过scrollTo(0,0),scrollDirection(View.FOCUS_UP) ),以及我能想到的一切.

由于我没有得到错误,我必须假设这些滚动命令实际上正在工作,但它们滚动到ListView的顶部,而不是包含它的ScrollView或RelativeLayout的顶部.这似乎是由谷歌自己对scrollTo(int x,int y)方法的描述所证实的,他们说"这个版本也会将滚动限制在我们孩子的范围内".

因此,为了使问题更长,我如何在ScrollView中包含的屏幕上加载一堆视图,然后以编程方式将整个视图滚动到页面顶部,以便用户可以与之交互?

谢谢!

roo*_*tek 255

尝试

mainScrollView.fullScroll(ScrollView.FOCUS_UP);
Run Code Online (Sandbox Code Playgroud)

它应该工作.


Moh*_*fez 172

有同样的问题,可能是某种bug.

即使是fullScroll(ScrollView.FOCUS_UP)其他答案也没有奏效.
只有对我有用的东西是在scroll_view.smoothScrollTo(0,0)显示对话框后立即调用.

  • 我从scroll_view.smoothScrollTo(0,0)解决,当我们在当时滚动视图的侧面有listview时,fullScroll(ScrollView.FOCUS_UP)将无效. (16认同)
  • 在大多数设备上,fullScroll(ScrollView.FOCUS_UP)都可以工作,但在Nexus 5和设备上,我的文本大小已经上升 - fullSscroll在操作栏下移动,smoothScrollTo(0,0)在所有设备上运行得更好. (2认同)

小智 97

我有同样的问题,这解决了它.希望它能帮到你.

listView.setFocusable(false);
Run Code Online (Sandbox Code Playgroud)

  • 这也是网格视图的正确解决方案。当同一视图组中有多个视图元素时,尤其是列表或gridview顶部的另一个listview时,就会发生这种情况。由于适配器会通知UI线程,因此将重新创建视图并向上滚动到第一个元素。只需调用listView.setFocusable(false)/ gridView.setFocusable(false)。如果您从xml文件中执行此操作,则它将无法正常运行。 (3认同)

Moh*_*ran 51

scrollViewObject.fullScroll(ScrollView.FOCUS_UP)这工作正常,但只有这一行的问题是,当在scrollViewObject中填充数据时,已立即调用.您必须等待几毫秒才能填充数据.试试这段代码:

scrollViewObject.postDelayed(new Runnable() {
    @Override
    public void run() {
        scroll.fullScroll(ScrollView.FOCUS_UP);
    }
}, 600);
Run Code Online (Sandbox Code Playgroud)

要么

 scrollViewObject.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollViewObject.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        scrollViewObject.fullScroll(View.FOCUS_UP);
    }
});
Run Code Online (Sandbox Code Playgroud)


Pel*_*nes 33

所有这些有效解决方案的主要问题是,当您还没有在屏幕上绘制时,您正试图向上移动滚动条.

您需要等到滚动视图显示在屏幕上,然后使用任何这些解决方案将其移动到上方.这是一个比postdelay更好的解决方案,因为你不介意延迟.

    // Wait until my scrollView is ready
    scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // Ready, move up
            scrollView.fullScroll(View.FOCUS_UP);
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案 - 不要忘记在`onGlobalLayout`方法的末尾删除全局监听器,调用`scrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this);` (6认同)

Com*_*ode 30

很容易

    ScrollView scroll = (ScrollView) findViewById(R.id.addresses_scroll);
    scroll.setFocusableInTouchMode(true);
    scroll.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
Run Code Online (Sandbox Code Playgroud)

  • 对我来说它没有用(第3行),解决方案是:scroll.fullScroll(View.FOCUS_UP); (包括你的前两行) (3认同)
  • 如果可以的话我想吻你!花了1-2个小时在这上面。当等待两个列表视图加载并且不想关注它们时最好的一个。将其添加到 onResume() 中。 (2认同)

小智 24

我面临同样的问题当我在View Flipper或Dialog中使用Scrollview时,该情况 scrollViewObject.fullScroll(ScrollView.FOCUS_UP)返回false,以便scrollViewObject.smoothScrollTo(0, 0)为我工作案例

滚动焦点顶部


Mla*_*jac 20

 final ScrollView scrollview = (ScrollView)findViewById(R.id.selected_place_layout_scrollview);

         scrollview.post(new Runnable() { 
                public void run() { 
                    scrollview.scrollTo(0, 0); 
                } 
            }); 
Run Code Online (Sandbox Code Playgroud)


tra*_*per 10

runOnUiThread( new Runnable(){
   @Override
   public void run(){
      mainScrollView.fullScroll(ScrollView.FOCUS_UP);
   }
}
Run Code Online (Sandbox Code Playgroud)


MaK*_*aKi 8

我在 Kotlin 中解决了我的问题,如下所示:

scrollview.isFocusableInTouchMode = true
scrollview.fullScroll(View.FOCUS_UP)
scrollview.smoothScrollTo(0,0)
Run Code Online (Sandbox Code Playgroud)

您还可以创建这样的扩展:

ScrollView.moveToTop()
{
    this.isFocusableInTouchMode = true
    this.fullScroll(View.FOCUS_UP)
    this.smoothScrollTo(0,0)
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

scrollView.moveToTop()
Run Code Online (Sandbox Code Playgroud)


Pan*_*iya 7

这对我有用

scroll_view.smoothScrollTo(0,0); // scroll to top of screen
Run Code Online (Sandbox Code Playgroud)


Had*_*ote 5

这是scrollview的强制滚动:

            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.scrollTo(0, 0);
                    scrollView.pageScroll(View.FOCUS_UP);
                    scrollView.smoothScrollTo(0,0);
                }
            });
Run Code Online (Sandbox Code Playgroud)