变量 ListView 项目布局

Posted

技术标签:

【中文标题】变量 ListView 项目布局【英文标题】:Variable ListView Item layout 【发布时间】:2020-02-11 01:32:32 【问题描述】:

我有一个 ListView 项目布局文件,在 LinearLayout 中有 3 个 TextView。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="horizontal">

    <TextView
        android:id="@+id/Count"
        android:layout_
        android:layout_
        android:layout_marginTop="4dp"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="4dp"
        android:layout_weight="0"
        android:layout_gravity="center_vertical"
        android:background="@drawable/seen_background"
        android:gravity="end"
        android:textColor="@color/black"
        tools:text="5,000" />

    <androidx.appcompat.widget.LinearLayoutCompat
        android:layout_
        android:layout_
        android:layout_weight="4"
        android:orientation="vertical">

        <TextView
            android:id="@+id/title"
            android:textSize="14sp"
            android:layout_
            android:layout_
            android:ellipsize="end"
            android:maxLines="1"
            android:textColor="@color/black"
            tools:text="War and Peace" />

        <TextView
            android:id="@+id/subtitle"
            android:textSize="8sp"
            android:layout_
            android:layout_
            android:ellipsize="end"
            android:maxLines="1"
            android:textColor="@color/gray"
            tools:text="Some subtitle" />

    </androidx.appcompat.widget.LinearLayoutCompat>

</LinearLayout>

根据用户的喜好,我要么想显示字幕 TextView 要么不显示。我的问题是,实现这一目标的最佳方法是什么?看来我有两个选择: 1. 创建两种不同的 ListView 项目布局 - 一种有字幕,一种没有。 2.使用相同的ListViewItem布局,设置subtitle.setVisibility(false)。

什么是首选?如果我使用选项#2,这对我来说似乎更可取,我不确定在哪里/何时在此 TextView 上设置可见性。 ListView 使用 SimpleCursorAdapter。

如果我 setVisibility(View.GONE) 我相信这会使 Title TextView 占据整个右侧,这就是我想要的。

【问题讨论】:

【参考方案1】:

什么是首选?

嗯,最好的解决方案是将过时的ListView 替换为RecyclerView

独立于此...对于像这样的微小的每行更改,修改行布局(例如,切换视图可见性)是完全合理的。如果有更多实质性的变化,那么多行布局会更好,但在这种情况下这似乎有点过头了。

我不确定在何处/何时在此 TextView 上设置可见性。 ListView 使用 SimpleCursorAdapter。

我使用SimpleCursorAdapter 已经有一段时间了(我有没有提到ListView 已经过时了?)。您基本上可以选择:

覆盖bindView(),切换覆盖方法中的可见性,然后链接到超类bindView() 的所有正常逻辑实现,或者

使用ViewBindersetViewBinder()

在任何一种情况下,请确保对于每一行,您始终将可见性设置为应有的状态(例如,可见或消失)。行通过ListView 回收,因此该视图的初始状态是不确定的。

【讨论】:

我在 ViewBinder (setViewValue()) 中做了 setVisibility(View.GONE)。这似乎运作良好。但是,现在不可见的 TextView 存在明显的差距。它很小但很明显。我对 View.GONE 的理解是它不应该占用任何空间。 是的,ListView 被 RecyclerView 取代了。有没有关于如何从旧转换为新的快速备忘单? @JJJones_3860:“我对 View.GONE 的理解是它不应该占用任何空间。” - 它不会占用任何空间。但是,请记住,布局中还有其他因素会影响剩余小部件的大小和位置。 你可以看到我上面的List Item Layout文件,如果我把subtitle textview设置为GONE,为什么那一行的title textview下面会有空格?如果我从布局中删除字幕文本视图,则没有空间。我被这个弄糊涂了。 找到了!谢谢。没有像 Count TextView 那样将 marginTop 和 marginBottom 添加到我的嵌入式 LinearLayout 中。固定。【参考方案2】:

将可见性设置为 GONE,应该如你所说

【讨论】:

【参考方案3】:

如果您在 Listview 中使用对象的 Arraylist,则向该对象添加一个额外的变量 boolean

   public Boolean isvisible;

设置默认为真 并在您的适配器中执行此操作

if(!isvisible)
textview2.setvisibility=View.INVISIBLE;//orView.GONE
else
textview2.setvisibiliti=View.VISIBLE;

【讨论】:

以上是关于变量 ListView 项目布局的主要内容,如果未能解决你的问题,请参考以下文章

为 listview 或 recyclerview 更改单个项目的布局

ListView - 卡片(颤动布局)

Listview实现不同类型的布局

Listview + Gridview 的 Android Studio 布局预览

关于理解布局单位

ListView展示不同布局需要注意的地方