变量 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()
的所有正常逻辑实现,或者
使用ViewBinder
和setViewBinder()
在任何一种情况下,请确保对于每一行,您始终将可见性设置为应有的状态(例如,可见或消失)。行通过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 更改单个项目的布局