我有一个ScrollView,在滚动视图中我有一个线性布局,在线性布局中我有多个列表视图。
下面有10个列表视图。
现在,如果我想在listview中滚动而不是滚动视图,我在listview的触摸侦听器中执行此操作: -
scrollView.requestDisallowInterceptTouchEvent(true);
如果我想滚动整个视图以使当前不可见的列表视图成为焦点,我将在右侧留下一些空间来拦截scrollview的触摸监听器。
请参阅下图: -
这里的问题是,我希望整个屏幕被listviews覆盖,如果我触摸列表视图的右侧,父母的监听器应该触发并且整个视图被滚动而不是列表视图
如果我在列表视图中滚动除了右侧,那么只有列表视图滚动应该有效。
我希望我足够解释。
答案 0 :(得分:0)
实际上只是按照你的描述它已经应该有用了。 但如果你仍然遇到问题,那么我就是为了测试你的想法而创造的:
XML布局文件
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp" >
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/lista1"/>
<ListView
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="2"
android:id="@+id/lista2"/>
<ListView
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:id="@+id/lista3"/>
<ListView
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:id="@+id/lista4"/>
<ListView
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:id="@+id/lista5"/>
</LinearLayout>
</ScrollView>
@EDIT 根据要求,我从LinearLayout
移除了保证金,但我在ScrollView
中留下了填充,但它仍然有效。
旧注:
注意
LinearLayout
内的 layout_marginRight =“10dp”,它 将在屏幕右侧提供一些空间ScrollView
滑块。
现在我的活动代码onCreate()
:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//create list on the run, just for testing
xxx.add("Objekt 1");
xxx.add("Objekt 2");
xxx.add("Objekt 3");
xxx.add("Objekt 4");
xxx.add("Objekt 5");
xxx.add("Objekt 6");
xxx.add("Objekt 7");
//connect variables with UI elemetns
lista1 = (ListView)findViewById(R.id.lista1);
lista2 = (ListView)findViewById(R.id.lista2);
lista3 = (ListView)findViewById(R.id.lista3);
lista4 = (ListView)findViewById(R.id.lista4);
lista5 = (ListView)findViewById(R.id.lista5);
//define adapter, one for all lists
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, xxx);
//set it to lists
lista1.setAdapter(adapter);
lista2.setAdapter(adapter);
lista3.setAdapter(adapter);
lista4.setAdapter(adapter);
lista5.setAdapter(adapter);
//this method fixes problem with ListView showing only one element when placed inside ScrollView
//code below
setListViewHeightBasedOnChildren(lista1);
setListViewHeightBasedOnChildren(lista2);
setListViewHeightBasedOnChildren(lista3);
setListViewHeightBasedOnChildren(lista4);
setListViewHeightBasedOnChildren(lista5);
//set onTouchListener, also one for all lists
lista1.setOnTouchListener(onTouchListener);
lista2.setOnTouchListener(onTouchListener);
lista3.setOnTouchListener(onTouchListener);
lista4.setOnTouchListener(onTouchListener);
lista5.setOnTouchListener(onTouchListener);
}
和onTouchListener()
private OnTouchListener onTouchListener = new OnTouchListener()
{
@Override
public boolean onTouch(View view, MotionEvent motion)
{
view.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
};
在这里,正如你所提到的,我正在禁止ScrollView拦截触摸事件,所以它不会对滚动做出反应。
现在修复ListView
高度的方法(如果你也遇到这个问题)
public static void setListViewHeightBasedOnChildren(ListView listView)
{
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null)
return;
int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.UNSPECIFIED);
int totalHeight = 0;
View view = null;
for (int i = 0; i < (listAdapter.getCount() / 2); i++)
{
view = listAdapter.getView(i, view, listView);
if (i == 0)
view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT));
view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
totalHeight += view.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}
Everythin结合在一起就像你所描述的一样。