Android列表视图内的滚动视图

我有一个android布局,它有一个scrollView与许多元素在其中。在scrollView的底部,我有一个listView,然后由一个适配器填充。

我遇到的问题是,android从scrollView中排除了listView,因为scrollView已经有一个可滚动的函数。我希望listView和内容一样长,并且主滚动视图是可滚动的。

我怎样才能实现这种行为呢?

这是我的主要布局:

<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:fillViewport="true"
android:gravity="top" >


<LinearLayout
android:id="@+id/foodItemActvity_linearLayout_fragments"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>


</ScrollView>

然后,我以编程方式将我的组件添加到线性布局中,id: foodItemActvity_linearLayout_fragments。下面是加载到线性布局中的一个视图。就是这个给我的卷轴带来了麻烦。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >


<TextView
android:id="@+id/fragment_dds_review_textView_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Reviews:"
android:textAppearance="?android:attr/textAppearanceMedium" />


<ListView
android:id="@+id/fragment_dds_review_listView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>

我的适配器然后填充这个列表视图。

当我点击主scrollView时,这是一个来自android层级查看器的图像:

Android List View within a scroll View .

如您所见,它排除了评论列表视图。

我应该能够向下滚动页面,看到8个评论,但它只显示了这3个,我可以滚动评论所在的一小部分。我想要一个全局页面滚动

327887 次浏览

永远不要把ListView放在ScrollView里面!你可以在谷歌上找到关于该主题的更多信息。在你的情况下,使用LinearLayout代替ListView,并以编程方式添加元素。

更新

<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:fillViewport="true"
android:gravity="top" >


<LinearLayout
android:id="@+id/foodItemActvity_linearLayout_fragments"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>

<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="2"
android:fillViewport="true"
android:gravity="top" >


<LinearLayout
android:id="@+id/foodItemActvity_linearLayout_fragments"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>

这里的重点是你试图将高度设置为0dp(固定)

    public static void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}


int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0); // 计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
}


ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}

你可以将此代码用于scrollview中的listview

对于任何子视图在ScrollView内滚动。ListView, RecyclerView,等等。你只需要将当前xml中的< >强ScrollView < / >强替换为androidx.core.widget.NestedScrollView,然后神奇的事情就发生了。

下面是一个示例xml代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">


<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp"
android:paddingBottom="20dp">


<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Recycler View inside a Scroll View"
android:textColor="@color/black"
android:textSize="@dimen/_20sp"
android:textStyle="bold" />


<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Below is a Recycler View as an example."
android:textSize="16sp" />


<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:layout_constraintTop_toBottomOf="@id/et_damaged_qty" />


<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="This textview automatically goes below the Recycler View."
android:textSize="16sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.core.widget.NestedScrollView>

现在你可以摆脱所有丑陋的黑客,你做了围绕嵌套滚动。

正如其他人已经提到的,不要在ScrollView中使用ListView。

为了解决问题,你可以使用LinearLayout,但仍然要保持整洁-用适配器填充你的LinearLayout,就像你用ListView做的一样

您可以使用这个类作为支持适配器的线性布局替代品

import android.content.Context;
import android.database.DataSetObserver;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;


public class AdaptableLinearLayout extends LinearLayout {


private BaseAdapter mAdapter;


private int mItemCount = 0;


private boolean mDisableChildrenWhenDisabled = false;


private int mWidthMeasureSpec;
private int mHeightMeasureSpec;




public AdaptableLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}


public BaseAdapter getAdapter() {
return mAdapter;
}


public void setAdapter(BaseAdapter adapter) {
mAdapter = adapter;
adapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
updateLayout();
super.onChanged();
}


@Override
public void onInvalidated() {
updateLayout();
super.onInvalidated();
}
});
updateLayout();
}


private void updateLayout() {
mItemCount = mAdapter.getCount();
requestLayout();
invalidate();
}


/**
* set size for the current View
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidthMeasureSpec = widthMeasureSpec;
mHeightMeasureSpec = heightMeasureSpec;


removeAllViewsInLayout();
for (int i = 0; i < mItemCount; i++) {
makeAndAddView(i);
}
}


private View makeAndAddView(int position) {
View child;


// Nothing found in the recycler -- ask the adapter for a view
child = mAdapter.getView(position, null, this);


// Position the view
setUpChild(child, position);


return child;


}


private void setUpChild(View child, int position) {


ViewGroup.LayoutParams lp = child.getLayoutParams();
if (lp == null) {
lp = generateDefaultLayoutParams();
}
addViewInLayout(child, position, lp);


// Get measure specs
int childHeightSpec = ViewGroup.getChildMeasureSpec(mHeightMeasureSpec, getPaddingTop() + getPaddingBottom(), lp.height);
int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec, getPaddingLeft() + getPaddingRight(), lp.width);


// Measure child
child.measure(childWidthSpec, childHeightSpec);


int childLeft;
int childRight;


// Position vertically based on gravity setting
int childTop = getPaddingTop() + ((getMeasuredHeight() - getPaddingBottom() - getPaddingTop() - child.getMeasuredHeight()) / 2);
int childBottom = childTop + child.getMeasuredHeight();


int width = child.getMeasuredWidth();
childLeft = 0;
childRight = childLeft + width;


child.layout(childLeft, childTop, childRight, childBottom);


if (mDisableChildrenWhenDisabled) {
child.setEnabled(isEnabled());
}
}
}

答案很简单,我很惊讶这里还没有答案。

列表本身使用Header View或/和Footer View。 不要将ScrollViewListView或任何可以滚动的对象混在一起。它意味着与页眉和页脚一起使用:)

从本质上讲,将ListView上面的所有内容放在另一个.xml文件中作为布局,然后在代码中扩展它,并将其作为头视图添加到列表中。

即。

View header = getLayoutInflater().inflate(R.layout.header, null);
View footer = getLayoutInflater().inflate(R.layout.footer, null);
listView.addHeaderView(header);
listView.addFooterView(footer);

你可以把所有东西都放到线性布局中。也就是说,创建线性布局,它将有两个子元素,scrollview和另一个线性布局。给他们布局权重,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >


<ScrollView
android:layout_width="fill_parent"
android:layout_height="0dip" android:layout_weight="0.8">


<LinearLayout
android:id="@+id/seTaskActivityRoot"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical" >


<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/taskName" />




<Spinner
android:id="@+id/seTaskPrioritiesSP"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />


<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/taskTargetInNumeric" />


<Spinner
android:id="@+id/seTaskUnitsSP"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />


<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/newTaskCurrentStatus" />


<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:hint="@string/addTaskCurrentStatus"
android:inputType="numberDecimal" />




</LinearLayout>
</ScrollView>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dip"
android:orientation="vertical" android:layout_weight="0.2">


<TextView
android:id="@+id/textView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />


<ListView
android:id="@+id/logList"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>


</LinearLayout>

我把它放在这里,以防有人会遇到同样的问题。我必须把ListView放到ScrollView里面。由于一些原因,带header的ListView不是一个选项。都不是一个选择使用线性布局代替ListView。所以我遵循了公认的解决方案,但它不起作用,因为列表中的项具有复杂的多行布局,并且每个listview项的高度都是可变的。高度测量不当。解决方案是测量ListView Adapter的getView()方法中的每个项。

@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view == null) {
. . .
view.setTag(holder);
} else holder = (ViewHolder)view.getTag();
. . .


// measure ListView item (to solve 'ListView inside ScrollView' problem)
view.measure(View.MeasureSpec.makeMeasureSpec(
View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
return view;
}
你可以很容易地把ListView放在ScrollView! 只需要改变ListView 以编程方式的高度,就像这样:

    ViewGroup.LayoutParams listViewParams = (ViewGroup.LayoutParams)listView.getLayoutParams();
listViewParams.height = 400;
listView.requestLayout();

这是完美的!

不要在父ScrollView中做任何事情。只对子ListView执行此操作。一切都会完美无缺。

mListView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mScrollView.requestDisallowInterceptTouchEvent(true);
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_UP:
mScrollView.requestDisallowInterceptTouchEvent(false);
break;
}
return false;
}
});

经过大量的R&D:

Fragment_one.xml应该是这样的:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/scrollViewParent"
android:orientation="vertical" >


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >


<RelativeLayout
android:layout_width="match_parent"
android:layout_height="400dip" >


<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" />


<View
android:id="@+id/customView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/transparent" />
</RelativeLayout>


<!-- Your other elements are here -->


</LinearLayout>


</ScrollView>

FragmentOne.java的Java类如下所示:

private ListView listView;
private View customView

< em > onCreateView < / em >

listView = (ListView) rootView.findViewById(R.id.listView);
scrollViewParent = (ScrollView)rootView.findViewById(R.id.scrollViewParent);
customView = (View)rootView.findViewById(R.id.customView);


customView.setOnTouchListener(new View.OnTouchListener() {


@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// Disallow ScrollView to intercept touch events.
scrollViewParent.requestDisallowInterceptTouchEvent(true);
// Disable touch on transparent view
return false;


case MotionEvent.ACTION_UP:
// Allow ScrollView to intercept touch events.
scrollViewParent.requestDisallowInterceptTouchEvent(false);
return true;


case MotionEvent.ACTION_MOVE:
scrollViewParent.requestDisallowInterceptTouchEvent(true);
return false;


default:
return true;
}
}
});

如果你只是在代码中实现了一个ListView,这段代码将解决你的问题。

如果你使用RelativeLayout作为ListView子视图,那么这段代码将返回一个NullPointerException 列。测量(0,0);,因为RelativeLayout。解决办法是把Relativelayout放在LinearLayout里面,它会工作得很好。

public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
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);
listView.requestLayout();
}

你可以通过在ScrollView中添加android:fillViewport="true"来解决这个问题

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:fillViewport="true"
android:scrollbars="vertical">


<ListView
android:id="@+id/statusList"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:animationCache="false"
android:divider="@null"
android:scrollingCache="false"
android:smoothScrollbar="true" />


</ScrollView>


在使用该属性之前,我的列表视图只有一个子视图是可见的。使用后,list的所有行或子元素都是可见的。

好吧,这是我的答案。固定ListView高度的方法足够封闭,但并不完美。如果大多数项目都是相同的高度,那工作得很好。但如果不是,那就有大问题了。我尝试了很多次,当我输出listItem的值时。getMeasureHeight和listItem。getMeasuerWidth到日志中,我看到宽度值变化很大,这在这里是不期望的,因为同一ListView中的所有项应该具有相同的宽度。问题来了:

有些人使用度量(0,0),这实际上使视图在两个方向上都没有边界,宽度也失控了。有些人尝试获取listView的twidth,但它返回0,没有意义。

当我进一步了解android如何渲染视图时,我意识到所有这些尝试都无法达到我搜索的答案,除非这些函数在视图渲染后运行。

这一次我使用getViewTreeObserver在ListView上,我想固定高度,然后添加ongloballayoutlistener。在这个方法中,我声明了一个新的OnGlobalLayoutListener,在这个方法中,getWidth返回ListView的实际宽度。

private void getLayoutWidth(final ListView lv, final int pad){
//final ArrayList<Integer> width = new ArrayList<Integer>();


ViewTreeObserver vto = lv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
lv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//width.add(layout.getMeasuredWidth());
int width = lv.getMeasuredWidth();
ListUtils.setDynamicHeight(lv, width, pad);
}
});
}


public static class ListUtils {
//private static final int UNBOUNDED = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
public static void setDynamicHeight(ListView mListView, int width, int pad) {
ListAdapter mListAdapter = mListView.getAdapter();
mListView.getParent();
if (mListAdapter == null) {
// when adapter is null
return;
}
int height = 0;




int desiredWidth = View.MeasureSpec.makeMeasureSpec(width - 2*pad, View.MeasureSpec.EXACTLY);
for (int i = 0; i < mListAdapter.getCount(); i++) {
View listItem = mListAdapter.getView(i, null, mListView);


listItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
//listItem.measure(UNBOUNDED, UNBOUNDED);
height += listItem.getMeasuredHeight() + 2*pad;
Log.v("ViewHeight :", mListAdapter.getClass().toString() + " " + listItem.getMeasuredHeight() + "--" + listItem.getMeasuredWidth());
}
ViewGroup.LayoutParams params = mListView.getLayoutParams();
params.height = height + (mListView.getDividerHeight() * (mListAdapter.getCount() - 1));
mListView.setLayoutParams(params);
mListView.requestLayout();
}
}

value pad,是我在ListView layout中设置的填充。

你不应该将ScrollView和ListView一起使用,因为ListView会处理它自己的垂直滚动。最重要的是,这样做破坏了ListView中处理大型列表的所有重要优化,因为它有效地迫使ListView显示其整个项目列表,以填充ScrollView提供的无限容器。

http://developer.android.com/reference/android/widget/ScrollView.html

如果出于某种原因你不想使用addHeaderViewaddFooterView,例如当你有几个列表时,一个好主意是重用ListAdapter来填充一个简单的LinearLayout,这样就没有滚动功能了。

如果你已经有了一个从ListFragment派生的完整片段,并且想用简单的LinearLayout将它转换成一个类似的片段,而不需要滚动(例如将它放在ScrollView中),你可以像这样实现一个适配器片段:

// converts listFragment to linearLayout (no scrolling)
// please call init() after fragment is inflated to set listFragment to convert
public class ListAsArrayFragment extends Fragment {
public ListAsArrayFragment() {}


private ListFragment mListFragment;
private LinearLayout mRootView;




// please call me!
public void init(Activity activity, ListFragment listFragment){
mListFragment = listFragment;
mListFragment.onAttach(activity);
mListFragment.getListAdapter().registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged();
refreshView();
}
});
}




@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// create an empty vertical LinearLayout as the root view of this fragment
mRootView = new LinearLayout(getActivity());
mRootView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
mRootView.setOrientation(LinearLayout.VERTICAL);
return mRootView;
}


// reusing views for performance
// todo: support for more than one view type
ArrayList<View> mViewsToReuse = new ArrayList<>();
ArrayList<View> mCurrentViews = new ArrayList<>();


// re-add views to linearLayout
void refreshView(){


// remove old views from linearLayout and move them to mViewsToReuse
mRootView.removeAllViews();
mViewsToReuse.addAll(mCurrentViews);
mCurrentViews.clear();


// create new views
for(int i=0; i<mListFragment.getListAdapter().getCount(); ++i){
View viewToReuse = null;
if(!mViewsToReuse.isEmpty()){
viewToReuse = mViewsToReuse.get(mViewsToReuse.size()-1);
mViewsToReuse.remove(mViewsToReuse.size()-1);
}
final View view = mListFragment.getListAdapter().getView(i, viewToReuse, mRootView);
ViewGroup.LayoutParams oldParams = view.getLayoutParams();
view.setLayoutParams(new LinearLayout.LayoutParams(oldParams.width, oldParams.height));
final int finalI = i;


// pass click events to listFragment
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListFragment.onListItemClick(null, view, finalI, finalI);
}
});
mRootView.addView(view);
mCurrentViews.add(view);
}
}

你可能还想根据需要将onCreateonPauseonResume等转发给原始片段,或者尝试继承而不是组合(但要重写某些方法,因此原始片段实际上不会附加到布局层次结构中);但我想尽可能地分离原始片段,因为我们只需要提取它的ListAdapter。如果你在onAttach中调用原始片段的setListAdapter,这可能就足够了。

下面是如何使用ListAsArrayFragment在不滚动的情况下包含OriginalListFragment。在父活动的onCreate中:

ListAsArrayFragment fragment = (ListAsArrayFragment) getFragmentManager().findFragmentById(R.id.someFragmentId);
OriginalListFragment originalFragment = new OriginalListFragment();
fragment.init(this, originalFragment);


// now access originalFragment.getListAdapter() to modify list entries
// and remember to call notifyDatasetChanged()

我的要求是在ScrollView中包含大小相等的项的ListView。我尝试了这里列出的其他一些解决方案,似乎没有一个能正确地调整ListView的大小(要么空间太小,要么太多)。以下是对我有效的方法:

    public static void expandListViewHeight(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null)
return;


ViewGroup.LayoutParams params = listView.getLayoutParams();
listView.measure(0, 0);
params.height = listView.getMeasuredHeight() * listAdapter.getCount() + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}

希望这能帮助到一些人。

listView.setOnTouchListener(new View.OnTouchListener() {


@Override
public boolean onTouch(View v, MotionEvent event) {
scrollView.requestDisallowInterceptTouchEvent(true);


int action = event.getActionMasked();


switch (action) {
case MotionEvent.ACTION_UP:
scrollView.requestDisallowInterceptTouchEvent(false);
break;
}


return false;
}
});

我知道已经很长时间了,但我也有这个问题,尝试了这个解决方案,它是有效的。所以我想这对其他人也有帮助。

我添加android:fillViewport="true"的布局xml的scrollView。 总的来说ScrollView是这样的

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/scrollView6"
android:fillViewport="true">
这对我来说就像魔法一样。 位于ScrollView内部的ListView再次扩展到它的大小

下面是ScrollView和ListView的完整示例代码。

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/scrollView6" android:fillViewport="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
....
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv_transList" android:layout_gravity="top"
android:layout_marginTop="5dp"/>
....
</LinearLayout>
</ScrollView>

你创建了一个自定义的ListView,它是不可滚动的

  public class NonScrollListView extends ListView {


public NonScrollListView(Context context) {
super(context);
}
public NonScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NonScrollListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
ViewGroup.LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
}
}

在布局资源文件中

     <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadingEdgeLength="0dp"
android:fillViewport="true"
android:overScrollMode="never"
android:scrollbars="none" >


<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >


<!-- com.Example Changed with your Package name -->


<com.Example.NonScrollListView
android:id="@+id/lv_nonscroll_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</com.Example.NonScrollListView>


<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/lv_nonscroll_list" >


<!-- Your another layout in scroll view -->


</RelativeLayout>
</RelativeLayout>


</ScrollView>
在Java文件中

创建一个你的customListview对象而不是ListView,像这样:

. NonScrollListView non_scroll_list = (NonScrollListView) findViewById(R.id.lv_nonscroll_list)

找到了一个解决方案scrollview -> viewpager -> FragmentPagerAdapter -> fragment ->动态listview,但我不是作者。

public class CustomPager extends ViewPager {


private View mCurrentView;


public CustomPager(Context context) {
super(context);
}


public CustomPager(Context context, AttributeSet attrs) {
super(context, attrs);
}


@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mCurrentView == null) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
return;
}
int height = 0;
mCurrentView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = mCurrentView.getMeasuredHeight();
if (h > height) height = h;
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);


super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}


public void measureCurrentView(View currentView) {
mCurrentView = currentView;
this.post(new Runnable() {
@Override
public void run() {
requestLayout();
}
});
}


public int measureFragment(View view) {
if (view == null)
return 0;


view.measure(0, 0);
return view.getMeasuredHeight();
}
}




public class MyPagerAdapter extends FragmentPagerAdapter {


private List<Fragment> fragments;
private int mCurrentPosition = -1;




public MyPagerAdapter(FragmentManager fm) {
super(fm);//or u can set them separately, but dont forget to call notifyDataSetChanged()
this.fragments = new ArrayList<Fragment>();
fragments.add(new FirstFragment());
fragments.add(new SecondFragment());
fragments.add(new ThirdFragment());
fragments.add(new FourthFragment());
}


@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
if (position != mCurrentPosition) {
Fragment fragment = (Fragment) object;
CustomPager pager = (CustomPager) container;
if (fragment != null && fragment.getView() != null) {
mCurrentPosition = position;
pager.measureCurrentView(fragment.getView());
}
}
}


@Override
public Fragment getItem(int position) {
return fragments.get(position);
}


@Override
public int getCount() {
return fragments.size();
}
}

片段布局可以是任何东西

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent" tools:context="nevet.me.wcviewpagersample.FirstFragment">




<ListView
android:id="@+id/lv1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#991199"/>
</LinearLayout>

然后在某个地方

 lv = (ListView) view.findViewById(R.id.lv1);
lv.setAdapter(arrayAdapter);
setListViewHeightBasedOnChildren(lv);
}


public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null)
return;


int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(),
View.MeasureSpec.UNSPECIFIED);
int totalHeight = 0;
View view = null;
for (int i = 0; i < listAdapter.getCount(); i++) {
view = listAdapter.getView(i, view, listView);
if (i == 0)
view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth,
LinearLayout.LayoutParams.WRAP_CONTENT));


view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
totalHeight += view.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}

找到了一个解决方案scrollview -> viewpager -> FragmentPagerAdapter -> fragment ->动态listview,但我不是作者。虽然有些bug,但至少还能用

public class CustomPager extends ViewPager {


private View mCurrentView;


public CustomPager(Context context) {
super(context);
}


public CustomPager(Context context, AttributeSet attrs) {
super(context, attrs);
}


@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mCurrentView == null) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
return;
}
int height = 0;
mCurrentView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = mCurrentView.getMeasuredHeight();
if (h > height) height = h;
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);


super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}


public void measureCurrentView(View currentView) {
mCurrentView = currentView;
this.post(new Runnable() {
@Override
public void run() {
requestLayout();
}
});
}


public int measureFragment(View view) {
if (view == null)
return 0;


view.measure(0, 0);
return view.getMeasuredHeight();
}
}




public class MyPagerAdapter extends FragmentPagerAdapter {


private List<Fragment> fragments;
private int mCurrentPosition = -1;




public MyPagerAdapter(FragmentManager fm) {
super(fm);//or u can set them separately, but dont forget to call notifyDataSetChanged()
this.fragments = new ArrayList<Fragment>();
fragments.add(new FirstFragment());
fragments.add(new SecondFragment());
fragments.add(new ThirdFragment());
fragments.add(new FourthFragment());
}


@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
if (position != mCurrentPosition) {
Fragment fragment = (Fragment) object;
CustomPager pager = (CustomPager) container;
if (fragment != null && fragment.getView() != null) {
mCurrentPosition = position;
pager.measureCurrentView(fragment.getView());
}
}
}


@Override
public Fragment getItem(int position) {
return fragments.get(position);
}


@Override
public int getCount() {
return fragments.size();
}
}

片段布局可以是任何东西

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent" tools:context="nevet.me.wcviewpagersample.FirstFragment">




<ListView
android:id="@+id/lv1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#991199"/>
</LinearLayout>

然后在某个地方

lv = (ListView) view.findViewById(R.id.lv1);
lv.setAdapter(arrayAdapter);
setListViewHeightBasedOnChildren(lv);
}


public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null)
return;


int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(),
View.MeasureSpec.UNSPECIFIED);
int totalHeight = 0;
View view = null;
for (int i = 0; i < listAdapter.getCount(); i++) {
view = listAdapter.getView(i, view, listView);
if (i == 0)
view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth,
LinearLayout.LayoutParams.WRAP_CONTENT));


view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
totalHeight += view.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}

使用这个ListView对我有用

   package net.londatiga.android.widget;


import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.ListView;
import android.content.Context;


public class ExpandableHeightListView extends ListView
{


boolean expanded = false;


public ExpandableHeightListView(Context context)
{
super(context);
}


public ExpandableHeightListView(Context context, AttributeSet attrs)
{
super(context, attrs);
}


public ExpandableHeightListView(Context context, AttributeSet attrs,
int defStyle)
{
super(context, attrs, defStyle);
}


public boolean isExpanded()
{
return expanded;
}


@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
// HACK! TAKE THAT ANDROID!
if (isExpanded())
{
// Calculate entire height by providing a very large height hint.
// But do not use the highest 2 bits of this integer; those are
// reserved for the MeasureSpec mode.
int expandSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);


ViewGroup.LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
}
else
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}


public void setExpanded(boolean expanded)
{
this.expanded = expanded;
}
}

在XML中

            <com.pakagename.ExpandableHeightListView
android:id="@+id/expandableHeightListView"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</com.Example.ExpandableHeightListView>

在MainActivity中

  ExpandableHeightListView listView = new ExpandableHeightListView(this);
listview=(ExpandableHeightListView)findViewById(R.id.expandableHeightListView);
listView.setAdapter(adapter); //set your adaper
listView.setExpanded(true);

请参考这个文章获取更多信息,也知道如何保持网格视图在滚动视图

在xml:

<com.example.util.NestedListView
android:layout_marginTop="10dp"
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="@null"


android:layout_below="@+id/rl_delivery_type" >
</com.example.util.NestedListView>

在Java中:

public class NestedListView extends ListView implements View.OnTouchListener, AbsListView.OnScrollListener {


private int listViewTouchAction;
private static final int MAXIMUM_LIST_ITEMS_VIEWABLE = 99;


public NestedListView(Context context, AttributeSet attrs) {
super(context, attrs);
listViewTouchAction = -1;
setOnScrollListener(this);
setOnTouchListener(this);
}


@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) {
if (listViewTouchAction == MotionEvent.ACTION_MOVE) {
scrollBy(0, -1);
}
}
}


@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}


@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);


int newHeight = 0;
final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
if (heightMode != MeasureSpec.EXACTLY) {
ListAdapter listAdapter = getAdapter();
if (listAdapter != null && !listAdapter.isEmpty()) {
int listPosition = 0;
for (listPosition = 0; listPosition < listAdapter.getCount()
&& listPosition < MAXIMUM_LIST_ITEMS_VIEWABLE; listPosition++) {
View listItem = listAdapter.getView(listPosition, null, this);
//now it will not throw a NPE if listItem is a ViewGroup instance
if (listItem instanceof ViewGroup) {
listItem.setLayoutParams(new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
listItem.measure(widthMeasureSpec, heightMeasureSpec);
newHeight += listItem.getMeasuredHeight();
}
newHeight += getDividerHeight() * listPosition;
}
if ((heightMode == MeasureSpec.AT_MOST) && (newHeight > heightSize)) {
if (newHeight > heightSize) {
newHeight = heightSize;
}
}
} else {
newHeight = getMeasuredHeight();
}
setMeasuredDimension(getMeasuredWidth(), newHeight);
}


@Override
public boolean onTouch(View v, MotionEvent event) {
if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) {
if (listViewTouchAction == MotionEvent.ACTION_MOVE) {
scrollBy(0, 1);
}
}
return false;
}
}
 <ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">


<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>


</LinearLayout>
</ScrollView>
我有一个类似的问题,由原始海报提出的问题-如何使列表视图在滚动视图内滚动-这个答案解决了我的问题。 禁止滚动包含在ScrollView中的ListView < / p >

我没有调用新的片段到现有的布局或类似的东西,就像OP所做的那样,所以我的代码看起来像这样:

<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:fillViewport="true"
android:gravity="top" >


<LinearLayout
android:id="@+id/foodItemActvity_linearLayout_fragments"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >




<TextView
android:id="@+id/fragment_dds_review_textView_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Reviews:"
android:textAppearance="?android:attr/textAppearanceMedium" />


<ListView
android:id="@+id/my_listView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>


</LinearLayout>


</ScrollView>

基本上我要做的是在我调用它之前检查listview的长度,当我调用它时,我把它变成那个长度。在你的java类中使用这个函数:

public static void justifyListViewHeightBasedOnChildren (ListView listView) {


ListAdapter adapter = listView.getAdapter();


if (adapter == null) {
return;
}
ViewGroup vg = listView;
int totalHeight = 0;
for (int i = 0; i < adapter.getCount(); i++) {
View listItem = adapter.getView(i, null, vg);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}


ViewGroup.LayoutParams par = listView.getLayoutParams();
par.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));
listView.setLayoutParams(par);
listView.requestLayout();
}

然后像这样调用函数:

justifyListViewHeightBasedOnChildren(listView);

结果是一个没有滚动条的列表视图,显示整个列表视图的长度,它与滚动视图的滚动条一起滚动。

只需要在父滚动视图中的listview height属性中设置所需高度的值。它将与其他父、子项目一起滚动。

这为我工作(link1link2):

  • 你创建了自定义的ListView,它是不可滚动的

    public class NonScrollListView extends ListView {
    
    
    public NonScrollListView(Context context) {
    super(context);
    }
    public NonScrollListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    }
    public NonScrollListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    }
    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int heightMeasureSpec_custom = View.MeasureSpec.makeMeasureSpec(
    Integer.MAX_VALUE >> 2, View.MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
    ViewGroup.LayoutParams params = getLayoutParams();
    params.height = getMeasuredHeight();
    }
    }
    
  • In Your Layout File

    <ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true">
    
    
    <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
    
    
    <!-- com.Example Changed with your Package name -->
    
    
    <com.thedeveloperworldisyours.view.NonScrollListView
    android:id="@+id/lv_nonscroll_list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
    </com.thedeveloperworldisyours.view.NonScrollListView>
    
    
    <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/lv_nonscroll_list" >
    
    
    <!-- Your another layout in scroll view -->
    
    
    </RelativeLayout>
    </RelativeLayout>
    
    
    </ScrollView>
    
  • Create a object of your customListview instead of ListView like :

     NonScrollListView non_scroll_list = (NonScrollListView) findViewById(R.id.lv_nonscroll_list);
    

在将adapter赋值给listview之后调用这个函数

public static void setListViewHeightBasedOnChildren
(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) return;


int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(),
View.MeasureSpec.UNSPECIFIED);
int totalHeight = 0;
View view = null;
for (int i = 0; i < listAdapter.getCount(); i++) {
view = listAdapter.getView(i, view, listView);
if (i == 0) view.setLayoutParams(new
ViewGroup.LayoutParams(desiredWidth,
ViewGroup.LayoutParams.WRAP_CONTENT));


view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
totalHeight += view.getMeasuredHeight();
}


ViewGroup.LayoutParams params = listView.getLayoutParams();


params.height = totalHeight + (listView.getDividerHeight() *
(listAdapter.getCount() - 1));


listView.setLayoutParams(params);
listView.requestLayout();
}
  • 在列表视图中使用滚动视图是不可能的,因为列表视图已经有滚动属性。
  • 要在滚动视图中使用列表视图,你可以遵循以下步骤,这对我来说很有效:

    1)创建NonScrollListView java文件,禁用列表视图的默认滚动属性。代码在下面

    package your-package-structure;
    
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.ViewGroup;
    import android.widget.ListView;
    
    
    public class NonScrollListView extends ListView {
    
    
    public NonScrollListView(Context context) {
    super(context);
    }
    public NonScrollListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    }
    public NonScrollListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    }
    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
    Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
    ViewGroup.LayoutParams params = getLayoutParams();
    params.height = getMeasuredHeight();
    }
    }
    

    2)现在创建xml文件,其中有NestedScrollView,并在此使用NonScrollListView列出您的项目。这将使您的整个屏幕滚动所有的视图。

            <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="vertical">
    <ViewFlipper
    
    
    android:id="@+id/v_flipper"
    android:layout_width="match_parent"
    android:layout_height="130dp">
    </ViewFlipper>
    <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    
    
    android:text="SHOP"
    android:textSize="15dp"
    android:textStyle="bold"
    android:gravity="center"
    android:padding="5dp"
    android:layout_marginTop="15dp"
    android:layout_marginBottom="5dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"/>
    <View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    
    
    android:layout_marginBottom="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:background="#ddd"/>
    </LinearLayout>
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_weight="1"
    >
    <com.abc.xyz.NonScrollListView
    android:id="@+id/listview"
    
    
    android:divider="@null"
    android:layout_width="match_parent"
    android:layout_marginBottom="10dp"
    android:layout_height="match_parent"
    android:padding="8dp">
    </com.abc.xyz.NonScrollListView>
    </LinearLayout>
    
    
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    
    
    android:gravity="bottom">
    <include layout="@layout/footer" />
    </LinearLayout>
    
    
    </LinearLayout>
    

    3)现在在java类,即home.java定义NonScrollListView而不是Listview

    package comabc.xyz.landscapeapp;
    import android.content.Intent;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.os.Bundle;
    import android.support.v4.app.FragmentTransaction;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.ImageView;
    
    
    import android.widget.ListView;
    import android.widget.Toast;
    import android.widget.Toolbar;
    import android.widget.ViewFlipper;
    

    公共类home扩展片段{ Int pos = 0; ViewFlipper v_flipper; < / p >

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_home, container, false);
    return view;
    }
    
    
    @Override
    public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
    NonScrollListView listView = (NonScrollListView) view.findViewById(R.id.listview);
    customAdapter customAdapter = new customAdapter(getActivity());
    listView.setAdapter(customAdapter);
    listView.setFocusable(false);
    
    
    customAdapter.notifyDataSetChanged();
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Log.d("listview click", "onItemClick: ");
    /* FragmentTransaction fr = getFragmentManager().beginTransaction().replace(R.id.fragment_container, new productdisplay());
    
    
    fr.putExtra("Position", position);
    fr.addToBackStack("tag");
    fr.commit();*/
    Intent intent = new Intent(getActivity(), productdisplay.class);
    intent.putExtra("Position", position);
    startActivity(intent);
    }
    });
    
    
    
    
    //image slider
    int images[] = {R.drawable.slide1, R.drawable.slide2, R.drawable.slide3};
    v_flipper = view.findViewById(R.id.v_flipper);
    for (int image : images) {
    flipperImages(image);
    
    
    }
    }
    
    
    private void flipperImages(int image) {
    ImageView imageView = new ImageView(getActivity());
    imageView.setBackgroundResource(image);
    
    
    v_flipper.addView(imageView);
    v_flipper.setFlipInterval(4000);
    v_flipper.setAutoStart(true);
    
    
    v_flipper.setInAnimation(getActivity(), android.R.anim.slide_in_left);
    v_flipper.setOutAnimation(getActivity(), android.R.anim.slide_out_right);
    }
    }
    

    注意:我在这里使用了Fragments

最好的代码

 <android.support.v4.widget.NestedScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/btmlyt"
android:layout_below="@+id/deshead_tv">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>


<TextView
android:id="@+id/des_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/btmlyt"
android:background="@android:color/white"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:scrollbars="vertical"
android:paddingTop="3dp"
android:text="description"
android:textColor="@android:color/black"
android:textSize="18sp" />
</LinearLayout>


</android.support.v4.widget.NestedScrollView>

最好的解决方案是在子滚动中添加这个android:nestedScrollingEnabled="true"属性,例如,我已经在我的ListView中插入了这个属性,它是ScrollView的子属性。我希望这个方法对你有用:-

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="TextView"/>
<ListView
android:nestedScrollingEnabled="true" //add this only
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="300dp"/>
</LinearLayout>
</ScrollView>
我很长一段时间都有同样的问题。然后我找到了一个适合我的解决方案。 添加一个ListViewHelper java类。下面是ListViewHelper.java

的代码
package com.molescope;


import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.ListView;


public class ListViewHelper {
public static void getListViewSize(ListView listView){
ListAdapter adapter = listView.getAdapter();
if(adapter!=null){
int totalHeight = 0;


//setting list adapter in loop tp get final size
for (int i=0; i<adapter.getCount(); i++){
View listItem = adapter.getView(i, null, listView);
listItem.measure(0,0);
totalHeight += listItem.getMeasuredHeight();
}
//setting listview items in adapter
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() *
(adapter.getCount()-1));
listView.setLayoutParams(params);


}else{
return;
}
}
}

在添加这个java文件之后,在你的代码中,无论你把适配器设置为listview,就在这一行之后添加下面的代码:

  ListView myList=(ListView) findViewById(R.id.listView);
myList.setAdapter(new ArrayAdapter<String>.
(this,android.R.layout.simple_list_item_1, listview_array));
ListViewHelper.getListViewSize(myList);

原谅我的英语。

如果你想在ScrollView中显示listView中的所有项,请使用这段代码

val params: ViewGroup.LayoutParams = listView!!.layoutParams
params.height = useitemsList.size * 200 //add static height
listView!!.layoutParams = params
listView!!.requestLayout()