我试图做这样的布局:
问题是我不希望ListViews
滚动。我希望它们达到所需的高度,并使整个屏幕可滚动。如果我将的高度设置ListView
为wrap_content
,则无法使用。使它起作用的唯一方法是设置一个特定的高度-但我不知道其中有多少个项目ListView
。
我知道我不应该把ListView
内ScrollView
-但我不希望ListView
是滚动的,只是为了显示所有项目。
也许有更好的方法可以使它起作用?
Answers:
您创建不滚动的自定义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);
NonScrollListView
,父级ScrollView
将滚动到的顶部NonScrollListView
,而不是的顶部ScrollView
。(用户必须向上滚动到。ScrollView
之前的内容NonScrollListView
。)对于EXACTLY
和AT_MOST
测量模式,以及传递给makeMeasureSpec()
UNSPECIFIED
,则父级将ScrollView
保持滚动Y =零(预期行为)。显然,NonScrollListView
在这种情况下,不会显示其全部内容。
根本不需要使用listview
。
如果您确实考虑过,listview
可以将a替换为LinearLayout
您的情况。该Adapter
会是相同的,但是的,而不是与你的连接适配器listview
,只需调用getView
适配器的功能在for循环中的数据,并添加检索到的意见,您的垂直linearlayout
。
但是,仅当列表中的项目较少并且这些项目的显示形式不占用大量内存时,才建议使用此方法。
LinearLayout
并不是ListView
要使用背后的优点的合理替代品AbsListView.CHOICE_MODE_MULTIPLE_MODAL
-为避免重新发明轮子,请参阅NonScrollListView
解决方案
好吧,有个很酷的Android家伙,名叫Mark Murphy,又名CommonsWare,他构建了一个非常有用的组件,名为CWAC Merge Adapter,可以让您完成所需的工作。您需要动态添加视图,而不是从XML添加;但是考虑到您的简单UI,这应该不是问题。当我不知道应该滚动哪种数据时,我将其用于此类情况。
如果你不想使用它(对于可能许可证的原因),你可以有一个单一的ListView那里(而不是那些连续2列表视图)和覆盖getItemViewsCount
,getItemViewType
以及getView
为了给上述布局。如果您android listview different rows
在Google上搜索,则会找到有用的信息。例如,此链接或该链接。
但是,我会选择合并适配器。
如果可以计算您的项目高度/宽度,我有一个简单的解决方案...您只需要创建ListView的父级Linearlayout,然后从Java固定父级Height。
假设您需要设计此视图...现在,父布局大小是通过Java定义的。
final LinearLayout parent=(LinearLayout)findViewById(R.id.parent);
final ListView listview=(ListView)findViewById(R.id.listview);
parent.setLayoutParams(new LinearLayout.LayoutParams(parent.getLayoutParams().width, dpToPx( number_of_item_in_list * per_item_size_in_dp )));
//number_of_item_in_list is list side ~ listArray.size();
//per_item_size_in_dp = calculate item size in dp. Ex: 80dp
public static int dpToPx(int dp)
{
return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}
就这样 :)
选择要滚动的ListView,然后添加方法“ setOnTouchListener”以自动将滚动条插入到ListView中
final ListView listview = (ListView) findViewById(R.id.list);
listview.setOnTouchListener(new ListView.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.
v.getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
// Allow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
// Handle ListView touch events.
v.onTouchEvent(event);
return true;
}
});
listview.setClickable(true);
希望对你有用
(ListView)
仍然可以正常工作。