滚动视图中的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,但它不工作

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

首先,可能你已经听说过了,但以防万一: 你不应该把一个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); } }); }