我正在尝试创建类似于WhatsApp的视图。我收到的数据是一组对话,存储在ArrayList
个对象中。该对象具有消息的所有属性即。 sendersID
,receiversID
,MessageID
,消息,时间戳等。我已经能够创建基于sendersID == myID
条件膨胀的发送方/接收方视图。
我面临的问题是用什么条件来膨胀datelayout
。我不想在arrayList
中添加新数据来检测日期更改。是否可以在不操纵列表数据的情况下获取视图?我已经为页眉和页脚视图做了这个,在那里很容易检测到第一个/最后一个项目。但是从适配器检测日期的变化并从那里创建视图本身似乎是一个挑战。我希望扩展相同的构思,为List
/ Recycler
添加不同类型的观看次数,并希望scalable
/ generic
解决此类问题。< / p>
答案 0 :(得分:1)
注意:为清楚起见,我会将您的数据对象称为“消息”。
您可以通过以下两种方式之一来处理日期TextView
。这两种方法都可行,但我的意思是#2的效果会更好。
1。日期TextView
是一个独立的项目,除了消息集合之外,适配器还需要考虑它们。
2. 日期TextView
包含在表示消息的项目中(例如,它位于行的布局XML中),您只需确定哪些行使其可见,哪些行不要。
适配器端更有趣。根据您采用的方法,您需要修改getCount()
(ListView
)或getItemCount()
(RecyclerView
)报告的项目数,或者您需要跟踪哪些项目有额外的显示逻辑。当然,您可能希望预处理集合(如果可能的话,在后台)以发现和存储这些额外信息。以下可能性是我过去使用过的所有内容:
A。修改数据结构以跟踪数据集中的日期及其位置;它可能只是封装在一些包装类中的两个集合。您的数据获取逻辑应该返回此结构而不是消息集合。这可以使用上面的#1 (numItems = numMessages + numDates
)或#2 (numItems = numMessages
)。
B。请勿修改数据结构,而是在Message中添加可变字段(boolean
)。您的预处理只是标记哪些消息需要显示日期。这几乎只适用于上面的#2 。
C。如果日期是真正“分离”两条消息的唯一内容,您可以让适配器知道数据的“部分”,并且只需在开始时显示日期(一节的最后一个部分。您无需修改集合即可执行此操作,例如:
List<Message> items;
List<AdapterSection> sections;
static class AdapterSection {
int start; // an index of the items list, e.g. in the range [0, items.size())
int count; // how many items in the section
}
对适配器进行分区可以使用上面的#1 和#2 。如果您使用的是#1 ,那么您可以让每个部分报告自己的大小(为日期添加1)并只是对部分大小求和。这种方法的主要缺点是在数据发生变化时保持各部分与数据同步。
我将称之为 D 的最后一个选项根本不需要任何预处理。当适配器绑定项目的数据时,您可以查看下一个项目并确定是否需要显示日期。这仅适用于上面的#2 。这是基于RecyclerView
适配器的一些伪代码:
@Override
public void onBindViewHolder(MessageViewHolder holder, int position) {
Message item = getItem(position);
// bind stuff to views ...
if (position < getItemCount() - 1) {
Message nextItem = getItem(position + 1);
if (hasDifferentDates(item, nextItem) {
// show TextView, bind date ...
} else {
// hide TextView
}
}
}