滚动两个ListView,尝试填充LinearLayout

时间:2011-10-20 08:44:38

标签: android android-layout android-listview android-cursoradapter

让自己陷入困境,尝试在同一个活动中挤压两个ListView。它工作,使用标准(垂直)LinearLayout中包含的两个单独的ListFragments。

问题是,两个列表一起比屏幕长,因此第二个列表部分隐藏。在视觉上,用户希望向上拖动整个屏幕并揭开第二个列表。但是这两个列表都有自己的内部滚动,并且它们不允许整个屏幕作为一个整体滚动。

幸运的是,这些列表实际上包含很少的项目(平均每个项目5个)。因此,理论上,我可以填充一些LinearLayouts容器。问题是,列表显示的数据来自Cursor并且是动态的。虽然我知道CursorAdapter的newView()和bindView()方法,但我不太明白如何将适配器连接到LinearLayout容器而不是ListViews。即CursorAdapter如何知道它必须在它在光标中找到的5个项目中创建5个行项目?我在哪里创建循环遍历游标项并在LinearLayout容器中创建项的循环?当光标中的数据发生变化时,如何刷新LinearLayout的内容?我发现的所有示例都巧妙地将这些问题包装到ListActivity提供的ListView中,但我不能使用ListViews!

我很困惑!

马努

编辑:以下是关注breceivemail建议时(片段)活动的xml布局。在breceivemail的建议之前,注释掉了原始的LinearLayout容器。还应该注意的是整个活动反过来由TabHost包含,但我不知道这是否会对手头的问题产生任何影响。

<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent">

<LinearLayout android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content">
<!--              
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:orientation="vertical"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content">
-->

    <TextView android:id="@+id/title"
               android:textSize="36sp"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content"
               android:text="@string/SelectPlayer"/>

    <TextView android:layout_width="fill_parent"
              android:layout_height="wrap_content" 
              android:text="@string/Playing"
              android:textSize="18sp"
              android:textStyle="bold"
              android:textColor="#000000"
              android:background="#999999"/>

    <fragment android:name="com.myDomain.myApp.PlayerListFragment"
              android:id="@+id/playing"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content" />

    <TextView android:layout_width="fill_parent"
              android:layout_height="wrap_content" 
              android:text="@string/Reserve"
              android:textSize="18sp"
              android:textStyle="bold"
              android:textColor="#000000"
              android:background="#999999"/>

    <fragment android:name="com.myDomain.myApp.PlayerListFragment"
              android:id="@+id/reserve"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content" />

</LinearLayout>      

</ScrollView>

1 个答案:

答案 0 :(得分:0)

将listViews放在垂直滚动中。您可以通过以下技巧在垂直滚动内部使用可滚动的listView。使用以下代码享受!

    private int listViewTouchAction;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //...

        setListViewScrollable(myListView1);
        setListViewScrollable(myListView2);
    }

    private void setListViewScrollable(final ListView list) {
            list.setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    listViewTouchAction = event.getAction();
                    if (listViewTouchAction == MotionEvent.ACTION_MOVE)
                    {
                        list.scrollBy(0, 1);
                    }
                    return false;
                }
            });
            list.setOnScrollListener(new OnScrollListener() {
                @Override
                public void onScrollStateChanged(AbsListView view,
                        int scrollState) {
                }

                @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                if (listViewTouchAction == MotionEvent.ACTION_MOVE)
                {
                    list.scrollBy(0, -1);
                }
            }
        });
    }

listViewTouchAction是一个全局整数值。