使用公共滚动将两个列表视图合并在一起

时间:2014-12-06 07:30:15

标签: android performance android-listview scrollview

我目前正在开发一个应用程序,在这个应用程序中,我必须将两个ListViews一个考虑在另一个上面,并且使用常见的滚动。我知道这不是最佳实践,相反,我应该只使用一个ListView,但问题在于使用sinlge ListView似乎无法实现的布局。实际上我的第一个ListView将包含我可以接受或忽略的朋友请求列表,这些请求不是静态的,可以无限制地变化,第二个列表将包含我的朋友,这些朋友可能会有所不同,即不是静态的。如果我必须只展示这两件事,那么我应该首选单个ListView并且可以很容易地完成但是当我必须添加我的第二个列表的按字母顺序排序,即我的朋友列表使用侧栏并且适用时,实际问题就出现了只有我的第二个清单不是第一个。这是没有侧栏的屏幕截图

enter image description here

但按字母顺序排列的边栏将用于新连接。所以我不认为,这可以通过单个列表实现,因为字母侧栏将被添加到整个列表而不是列表的一部分。所以现在我正在努力避免使用ScrollView为我的两个ListViews,因为这将是非常昂贵的。所以我需要最好的方法来使用这种类型的结构。应该在ScrollView中使用两个ListView,或者可以使用一个更优选的ListView来完成。

请倒出你的建议。提前致谢。

1 个答案:

答案 0 :(得分:0)

如果将两个ListView一个接一个地放在LinearLayout容器中,然后将该容器放在ScrollView内?然后(以编程方式),您计算ListView所需的总高度以包装其内容,因此您的ListView将永远不会滚动,但您的ScrollView将会。这是一个想法:

布局

<?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" >
    <!-- Container -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <!-- Your list views -->
        <ListView
            android:id="@+id/listView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </ListView>
        <ListView
            android:id="@+id/listView2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </ListView>
    </LinearLayout>
</ScrollView>

代码

private void resizeListView(ListView listView) {
    ListAdapter adapter = listView.getAdapter(); 
    int count = adapter.getCount();
    int itemsHeight = 0;
    // Your views have the same layout, so all of them have
    // the same height
    View oneChild = listView.getChildAt(0);
    if( oneChild == null)
        return;
    itemsHeight = oneChild.getHeight();
    // Resize your list view
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)listView.getLayoutParams();
    params.height = itemsHeight * count;
    listView.setLayoutParams(params);
}

您可能希望(实际上您需要)等待ListView被绘制,以便getChildAt(int index)实际上可以返回View并避免获取null。您可以将此添加到onCreate

ViewTreeObserver listVTO = listView.getViewTreeObserver();
listVTO.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        listView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        resizeListView(listView);
    }
});

只是一个建议,您可能想尝试新的RecyclerView,因为它可以使用不同类型的View来处理回收