滚动视图中的ListView我的滚动视图移动到列表视图的顶部。 我如何防止这种情况?

我有我的滚动视图下的几乎滚动页面之前的列表视图,但是一旦我的列表视图被填充滚动视图移动到列表视图的顶部。 我该如何解决这个问题/防止这种情况发生?

SCROLL VIEW XML:

<ScrollView android:id="@+id/tvscrollview" android:layout_marginTop="8.0dip" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <include layout="@layout/a" /> <include layout="@layout/b" /> <include layout="@layout/c" /> <include layout="@layout/d" /> <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> </ScrollView> 

我试过做sv.fullScroll(ScrollView.FOCUS_UP); 和所有这些东西到我的scrollview,但它不工作

  • Android 5.0棒棒糖:setColorFilter“泄漏”到其他button上
  • Android层次结构查看器不显示渲染的时间
  • Android:即使指定duplicateParentState,子元素也会与父级共享压缩状态
  • android:uses-permission和uses-permission有什么区别?
  • Android:用户名是什么inputType
  • 如何在Android中创建一个整齐的两列输入表单?
  • 在Android中自动隐藏媒体播放器布局
  • 从Spinner下拉菜单中删除保证金
  • 首先,可能你已经听说过了,但以防万一: 你不应该把一个ListView放在一个ScrollView ,因为ListView本身已经有一个ScrollView并且这个devise违背了整个ListView想法。 如果你确信你必须使用它,可能有更好的方法来使用,你可能需要以某种方式简化你的代码。

    现在,即使你仍然想使用这样的东西,你可以使用这样的东西:

     package your.package.name; import android.view.View; import android.view.ViewGroup; import android.widget.ListAdapter; import android.widget.ListView; public class ScrollingListView { public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) return; int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); } } 

    您只需通过.setAdapter()设置适配器,然后调用ScrollingListView.setListViewHeightBasedOnChildren(your_listview) 。 这应该重新调整你的窗口到你的ListView高度。

    —-编辑—-

    这可能是最丑陋的解决方法,但请尝试执行以下操作:

     ScrollView sv = (ScrollView) findViewById(R.id.your_scrollview); sv.setEnabled(false); // Populate your ListView sv.setEnabled(true); 

    我们不应该把一个ListView放在一个ScrollView

    解决方法:由于listview的notifyDataSetChanged()ScrollView向上/向下移动,然后尝试,

     scrollview.setEnabled(false); listview.setFocusable(false); adapter.notifyDataSetChanged(); scrollview.setEnabled(true); 

    只需要在列表中添加项目之前做一件事

     listview.setFocusable(false); 

    之后,你可以再次做到这一点

     listview.setFocusable(true); 

    如果需要的话,它肯定会工作

    将所有东西添加到列表视图中作为标题 。

    现在我看到了代码..你只能在一个scrollview里面有一个ViewGroup。 所以你会扭曲两个布局到另一个,但一个ListView自动有一个滚动视图,所以不会真的工作。

    所以你必须做的是在你的ListActivity(片段)中使用addHeader视图,并从另一个xml文件中将LinearLayout1充满活动。

    加:

     android:transcriptMode="disabled" 

    在列表中你不想滚动

    从Android文档

    在可滚动的视图内不可能创build一个可滚动的视图。 但作为一个解决这个问题的方法,只有在这个listviews并不占用太多的内存,如果所有的意见加载。 你可以使用这个

     import android.content.Context; import android.util.AttributeSet; import android.widget.ListView; public class NonScrollableListView extends ListView { public NonScrollableListView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Do not use the highest two bits of Integer.MAX_VALUE because they are // reserved for the MeasureSpec mode int heightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightSpec); getLayoutParams().height = getMeasuredHeight(); } } 

    再次,这是不好使用此解决方法

    我会包裹列表和其他布局在一个RelativeLayout而不是一个LinearLayout

     <ScrollView android:id="@+id/tvscrollview" android:layout_marginTop="8.0dip" android:layout_width="fill_parent" android:layout_height="fill_parent" > <RelativeLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <include layout="@layout/a" /> <include layout="@layout/b" /> <include layout="@layout/c" /> <include layout="@layout/d" /> </LinearLayout> <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/container" /> </RelativeLayout> </ScrollView> 

    通过这种方式, ListView的顶部边界位于LinearLayout的底部边界处,并将始终保持在其他位置。

    你不能直接在RelativeLayout包含! 在这里看到更多的细节。

    我已经在你的xml文件中做了2或3个改变

     <ScrollView android:id="@+id/tvscrollview" android:layout_marginTop="8.0dip" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="10dp"> // This will let you see the scroll bar of list view when you scroll your list view. <include layout="@layout/a" /> <include layout="@layout/b" /> <include layout="@layout/c" /> <include layout="@layout/d" /> <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="300dp" />// Instead of wraping up your list, if you wish you can give certain height to your list view. </LinearLayout> </ScrollView> 

    你需要的另一件事是在你的Java文件中写入给定的代码。

      onCreate() { .... ScrollView sView=(ScrollView)findViewById(R.id.tvscrollview); yourListView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View arg0, MotionEvent arg1) { if(arg1.getAction() == MotionEvent.ACTION_DOWN || arg1.getAction() == MotionEvent.ACTION_MOVE) { sView.requestDisallowInterceptTouchEvent(true); } return false; } }); 

    我希望这可以帮助你。

    您可能想要通过使用以下来实现此目的:

      <LinearLayout ......> <ScrollView android:id="@+id/tvscrollview" android:layout_marginTop="8.0dip" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <include layout="@layout/a" /> <include layout="@layout/b" /> <include layout="@layout/c" /> <include layout="@layout/d" /> </LinearLayout> </ScrollView> <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> 

    在scrollview之外包装你的listview,否则在scrollview之内,因为你不应该使用带有ListView的ScrollView,因为ListView负责自己的垂直滚动。 最重要的是,这样做会挫败ListView中用于处理大型列表的所有重要优化,因为它有效地强制ListView显示其整个项目列表以填充由ScrollView提供的无限容器。

    来源Android文档

    我唯一的解决scheme是添加一个EditText作为布局的第一个孩子。 丑,我知道。

     <EditText android:layout_width="0dp" android:layout_height="0dp" /> 

    我有同样的问题,我find了解决scheme之后,通过更改设置适配器我更改可见性的可见性后更改XML列表视图的可见性

     listView.setAdapter(adapter); listView.setVisibility(View.VISIBLE); 

    虽然这个问题的答案已经很晚了,这个答案已经被接受了,但我认为在这里解决问题的方式可能会帮助别人在单个SO线程中find与这个问题相关的所有问题。

    所以这是我的情况:我有一个在ScrollView的布局结尾的ListView ScrollView 。 我知道这是非常糟糕的做法。 我可以通过将标题附加到ListView来实现相同的行为。 但无论如何,我的ListView得到了焦点时,填充数据和页面自动滚动到ListView开始的底部。

    我试着在这里接受的答案,但它不适合我。 我尝试在布局的顶部使用一个虚拟EditText ,以便它可以自动请求焦点,但它也不工作。 因为ListView在从REST Api调用中加载数据后正在获得焦点。

    然后我发现这个答案 ,这真的帮助。 所以我想把它放在这里,以便其他人可以从像我这样的同样问题的单线程获得帮助。

    mainScrollView.fullScroll(ScrollView.FOCUS_UP); 对我来说也不起作用,因为在其他观点被填充之后,这份名单已经被填充了。 所以我不得不在ListView填充后将ScrollView到顶端。 所以这是我如何解决我的问题。

     mScrollView.setEnabled(false); mIntroducerListView.setFocusable(false); mListAdapter.notifyDataSetChanged(); // Force scroll to the top of the scroll view. // Because, when the list view gets loaded it focuses the list view // automatically at the bottom of this page. mScrollView.smoothScrollTo(0, 0); 

    我尝试了以上的答案,但他们都没有工作。 以下是我的最终解决scheme。 只需重写onFinishInflate方法,然后做一个文章scrollTo(0,0)。

     @Override protected void onFinishInflate() { super.onFinishInflate(); this.post(new Runnable() { @Override public void run() { scrollTo(0, 0); } }); }