【问题标题】:Merging two listviews one above another with a common scroll用一个共同的滚动合并两个列表视图
【发布时间】:2014-12-06 07:30:14
【问题描述】:

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

但字母侧边栏将用于新连接。所以我不认为,这可以通过单个列表实现,因为字母侧栏将添加到整个列表而不是列表的一部分。所以现在我正试图避免为我的两个 ListView 使用 ScrollView,因为那会非常昂贵。所以我需要最好的方法来处理这种类型的结构。应该在 ScrollView 中使用两个 ListView,或者可以使用一个更受欢迎的 ListView 来完成。

请提出您的建议。提前致谢。

【问题讨论】:

  • @kaushik 问题不在于每一行的布局不同,问题是我如何添加仅附加到新连接列表的侧边栏的字母排序,因为我必须在包含我的列表视图的活动布局,它将覆盖整个列表,而不仅仅是新的连接部分
  • 对于您的常见滚动,您可以使用可扩展的列表视图。对于您的排序,您可以在可扩展列表视图的适配器中创建一个函数,以仅对第二部分中显示的数据进行排序,在您的情况下是朋友的列表。
  • 问题不在排序中,问题是我如何才能在第二部分仅显示包含 A-Z 字母的侧栏@ShadabMirza
  • @MukeshRana 您必须向用户界面展示您希望侧边栏的放置方式和位置。此外,如果布局和数据排序不是您的问题,那么您应该在问题中提及。

标签: android performance android-listview scrollview


【解决方案1】:

将你的两个ListViews 一个接一个地放入LinearLayout 容器中,然后将该容器放入ScrollView 中呢?然后(以编程方式)计算ListView 需要的总高度以包装其所有内容,因此您的ListViews 永远不会滚动,但您的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 并避免获得空值。您可以将此添加到您的onCreate

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

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

【讨论】:

  • 感谢您的回答,但问题是我不想为此目的使用 ScrollView,因为 Romain Guy 在此答案stackoverflow.com/questions/3495890/… 中说使用 ListView 使其不滚动非常昂贵。所以我正在为此寻找更好、更有效的方法:)
  • @MukeshRana 我找不到评论解释为什么它真的很贵(编辑:对不起,我只需要阅读上面的几个答案),但那是我当时最好的 jajaja我建议(再次)试用 RecyclerView,因为它可以完全满足您的要求(除非您的要求是使用 ListView
  • 好吧,就 RecyclerView 而言,虽然我知道使用 appcompat 库,但我对与较低版本的向后兼容性有疑问,这可以做到,但我仍然不确定。你能解开我的疑惑并帮助我找到一个完美的使用 RecyclerView 的样本
  • 你试过official doc吗?您还可以在 SDK 目录 (adt/sdk/samples/android-21/ui/views) 中找到一个很好的示例。如果它不存在,那么只需使用 SDK 管理器安装它。当您使用支持库 v7 时,您可以向后兼容直到 API 7。
  • 好吧,你的意思是说除了在滚动视图中使用两个 ListViews/RecyclerView 之外别无他法??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2016-07-25
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
相关资源
最近更新 更多