如何在整个视图填充listviews时滚动父项?

时间:2014-01-28 04:44:41

标签: android listview

我有一个ScrollView,在滚动视图中我有一个线性布局,在线性布局中我有多个列表视图。

下面有10个列表视图。

现在,如果我想在listview中滚动而不是滚动视图,我在listview的触摸侦听器中执行此操作: -

scrollView.requestDisallowInterceptTouchEvent(true);

如果我想滚动整个视图以使当前不可见的列表视图成为焦点,我将在右侧留下一些空间来拦截scrollview的触摸监听器。

请参阅下图: -

这里的问题是,我希望整个屏幕被listviews覆盖,如果我触摸列表视图的右侧,父母的监听器应该触发并且整个视图被滚动而不是列表视图

如果我在列表视图中滚动除了右侧,那么只有列表视图滚动应该有效。

我希望我足够解释。 enter image description here

1 个答案:

答案 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结合在一起就像你所描述的一样。