Android 复杂的回收问题。省略某些字段
尝试构建一个recyclerview,其中一个小部件(保存日期的TextView)根据变量而消失(View.go)。我对recyclerview中的项目所做的如下所示:Android 复杂的回收问题。省略某些字段,android,android-recyclerview,Android,Android Recyclerview,尝试构建一个recyclerview,其中一个小部件(保存日期的TextView)根据变量而消失(View.go)。我对recyclerview中的项目所做的如下所示: <?xml version="1.0" encoding="utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat android:layout_width="match_parent"
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/historyItemLayout"
android:weightSum="100"
android:layout_marginTop="3dp"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:id="@+id/historyItemDateTV"
android:background="@color/grey_300"
android:text="09-24-2020"
/>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="100"
android:layout_marginTop="3dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="20"
android:layout_marginStart="15dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/historyItemTeamNameTV"
android:text="@string/team_name"
android:textColor="@color/black"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/historyItemPlayerNameTV"
android:text="@string/player_name"
android:textColor="@color/black"
/>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
//Now handle hiding of extraneous dates
if(lastDate == child.date) {
holder.dateTV.visibility = View.GONE
}
else {
lastDate = child.date
}
有一个条目列表,每个条目都包含将推送到适配器的所有数据。因此,该列表中的每个条目都包含一个日期字段、一个球员姓名、一个球队名称和一些其他数据(为了简洁起见,此处省略)
我想做的是显示第一次出现的日期,但在日期更改之前隐藏(实际上是View.GONE)
以下是一个例子:
条目1 2020-09-27其他数据
条目2 2020-09-27其他数据
条目3 2020-09-27其他数据
条目4 2020-08-01其他数据
条目5 2020-05-05其他数据
因此,对于这一点,我会显示一行显示2020-09-27,然后在下面有三行显示三个条目的数据,每个条目的日期都是2020-09-27。然后,我将显示另一行,其中仅包含日期2020-08-01,然后在下一行显示该日期的数据,最后显示另一行,其中仅包含日期2020-05-05,另一行包含该最终日期的数据
我已使用比较器将所有数据正确排序,以便插入适配器,但如何在显示时检查日期行是否需要隐藏?我想我得到了答案…将验证 在RecyclerView中,我将保存上次显示的日期,并在onBindViewHolder中进行检查。如果日期匹配,我将隐藏该文本视图(或者它的布局) 大概是这样的:
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/historyItemLayout"
android:weightSum="100"
android:layout_marginTop="3dp"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:id="@+id/historyItemDateTV"
android:background="@color/grey_300"
android:text="09-24-2020"
/>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="100"
android:layout_marginTop="3dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="20"
android:layout_marginStart="15dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/historyItemTeamNameTV"
android:text="@string/team_name"
android:textColor="@color/black"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/historyItemPlayerNameTV"
android:text="@string/player_name"
android:textColor="@color/black"
/>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
//Now handle hiding of extraneous dates
if(lastDate == child.date) {
holder.dateTV.visibility = View.GONE
}
else {
lastDate = child.date
}
不确定我是否理解正确(截图可能会更好地解释这一点) 但是我认为,你应该使用
View.INVISIBLE
而不是View.GONE
,这样才不会弄乱整个布局<代码>查看。不可见和查看。消失
两者都按字面意思执行-当父节点(回收项目)设置了包装内容
时,这可能会导致混乱(高度不均)