android - Android在ScrollView里面添加了一个 ListView

  显示原文与译文双语对照的内容
0 0

我知道"不要将ListView放入ScrollView中"是一个非常糟糕的实践,因为ListView拥有自己的滚动。 但是,我还有其他一些项目( 按钮和 textviews ) 附加到 ListView 。 对于那些,我肯定需要使用 ScrollView 。 我找到了一些( http://nex-otaku-en.blogspot.com/2010/12/android-put-listview-in-scrollview.html ) 来防止塌陷 Listview 。 但是,就像我所说,我需要一个ScrollView来封装XML表单上的所有项。 我已经添加了我的xml代码,请指导如何实现。

 <ScrollView
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"> 
<LinearLayout 
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"> 
 <ListView
 android:id="@+id/listView1"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:choiceMode="singleChoice">
 </ListView>
 <LinearLayout
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal"> 
 <Button
 android:id="@+id/button1"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="Button1"/>
 </LinearLayout>
 <TextView
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="@string/longtext"/>
</LinearLayout>
</ScrollView>
时间:原作者:4个回答

0 0

ListView本身是可以滚动的。 不要将ListView放在滚动视图中。

将你的ListView移动到 scorllview 。 你还可以向listview中添加页眉和页脚。

通过google查看视频

https://www.youtube.com/watch?v=wDBM6wVEO70

原作者:
0 0

我找到了另一个&的解决方案。

当所有其他解决方案在对列表项进行加权时工作为 height,即使列表项的高度为可变值,这个解决方案仍然提供最佳结果。

在 xml &中使用这个定制的类,你可以去。

public class NestedListView extends ListView implements OnTouchListener, 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;
 }
}
原作者:
0 0

可以以使用可以展开的Listview在scrollview内使用 Listview,它将花费的长度长度为 with,创建一个自定义类。

软件包 com.knight.utils ;

import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.ListView;
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;
}
} 

以编程方式将这里行添加到代码后,它将在scrollview旁边扩展 listview,

Listview listview=(Listview)findviewbyid(R.id.listview1);
((ExpandableHeightListView)listview).setExpandable(true);
原作者:
...