Android 使用两个列表视图滚动,尝试填充LinearLayout

Android 使用两个列表视图滚动,尝试填充LinearLayout,android,android-layout,android-listview,android-cursoradapter,Android,Android Layout,Android Listview,Android Cursoradapter,试图在同一个活动中压缩两个ListView使我陷入困境。它使用标准(垂直)线性布局中包含的两个单独的列表片段工作 问题是,两个列表加在一起比屏幕长,因此第二个列表部分隐藏。在视觉上,用户希望将整个屏幕向上拖动,并显示第二个列表。但是这两个列表有自己的内部滚动,不允许整个屏幕作为一个整体滚动 幸运的是,这些列表实际上包含很少的项目(平均每个项目5个)。因此,理论上,我可以填充几个LinearLayouts容器。问题是,列表显示的数据来自光标,并且是动态的。虽然我知道CursorAdapter的ne

试图在同一个活动中压缩两个ListView使我陷入困境。它使用标准(垂直)线性布局中包含的两个单独的列表片段工作

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

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

我糊涂了

马努

编辑:以下是遵循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>

将列表视图垂直滚动。通过以下技巧,您可以在垂直滚动的内部拥有可滚动的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是一个全局整数值。

如果只创建布局,使两个ListView适合屏幕大小,不是更好的解决方案吗?这是一个公平的评论@KasperMoerch,但列表项的高度设计得异常大。列表项需要快速点击,尤其是第一个列表中的项目,UI的原则是,越大的项目到达并与之交互越快。这是公平的-但ListView的一般观点是,它是可滚动的,这意味着您可以滚动到列表中所需的点,这也意味着如果您在一个屏幕中有两个ListView,则它们只需要占据每个屏幕的一半。我觉得你在做某种游戏,很酷。你不应该把这看作是批评或是我的固执——我只是想挑战你对UI设计的选择。也许没有更好的解决办法。别担心@KasperMoerch,我在这个问题上有点僵持,从不同的角度看是有用的,所以我没有把你的评论看作是批评,也没有想到你很固执。我实际上不是在做一场比赛,而是在写一个应用程序,为我的球队/俱乐部记录篮球统计数据(在这个过程中顺便学习了java+android)。第一个列表是球场上的球员名单(通常是5名,但理论上可以降到2名)。第二个列表是作为替补的球员,介于0和7之间。当某件事发生时,用户点击一名球员,并被引导到另一个活动,他可以选择发生了什么,即2分投篮或犯规。从理论上讲,似乎只有真正参加比赛的人才能触发事件,这表明只有在场上的球员名单是必要的。在实践中,可能需要增加关于一个人作为替补的统计数据。亲爱的@breceivemail,谢谢您的努力。不幸的是,这似乎不起作用。代码是功能性的,但加上我在原始文章中添加的布局,这只会使两个listview短得多,而且它们仍然保持内部滚动。不能作为单个视图滚动。此外,每次我稍微拖动一个列表,它显示的项目视图就越来越少,最终完全消失,所有项目都以某种方式隐藏起来。问:当你写listViewTouchAction变量时,你指的是活动全局还是应用全局?我已经在华硕Eee、Gallagxy tab和所有模拟器上对其进行了测试。