我正在尝试制作这样的布局:
问题在于我不希望ListViews可滚动。我希望它们尽可能高,并使整个屏幕可滚动。如果我将ListView的高度设置为wrap_content
,则不起作用。使其工作的唯一方法是设置一个特定的高度 - 但我不知道ListView中有多少项。
我知道我不应该将ListView放在ScrollView中 - 但我不希望ListView可以滚动,只是为了显示所有项目。
也许有更好的方法让它发挥作用?
答案 0 :(得分:146)
您创建了不可滚动的自定义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);
答案 1 :(得分:7)
根本不需要使用列表视图。
如果您真的考虑过它,可以在您的情况下使用linearlayout替换listview。适配器是相同的,但是不是将适配器与listview相连,只需在数据的for循环中调用适配器的getView函数,并将检索到的视图添加到垂直linearlayout。
但是,如果您的列表中包含少量项目,并且这些项目的显示表示不是内存密集型,则建议使用此方法。
答案 2 :(得分:2)
执行此操作(2017年)的最佳方法是使用带有NestedScrollView的RecyclerView。不需要黑客攻击,它可以像你想要的那样开箱即用。
答案 3 :(得分:0)
嗯,有一个名叫Mark Murphy a.k.a. CommonsWare的很酷的Android人,他建立了一个名为CWAC Merge Adapter的非常有用的组件,可以让你做你需要的。您需要动态添加视图而不是XML;但考虑到你的简单UI,这应该不是问题。当我不知道我应该滚动什么样的数据时,我正在将它用于这种情况。
如果您不想使用它(可能出于许可原因),您可以在那里拥有一个列表视图(而不是那些连续的2个列表视图)并覆盖getItemViewsCount
,getItemViewType
和getView
为了给出上面的布局。如果您在Google上搜索 android listview different rows
,您会找到有用的信息。例如this link或this one。
但是,我会选择merge-adapter。
答案 4 :(得分:0)
如果可以计算项目高度/宽度,我有一个简单的解决方案...您只需要创建ListView的父Linearlayout,然后从Java修复父高度。
假设您需要设计此视图...现在,父级布局大小是从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);
}
这就是全部:)
答案 5 :(得分:0)
选择你想要Scrollable的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);
我希望这对你有用