一种聊天数据的显示方法及装置与流程

文档序号:12463184阅读:215来源:国知局
一种聊天数据的显示方法及装置与流程

本发明涉及信息处理技术领域,特别是涉及一种聊天数据的显示方法及装置。



背景技术:

用户在利用某些聊天APP(如腾讯qq)进行聊天时,移动终端会接收用户发送的聊天数据以及服务器自动生成的数据。其中,聊天数据为用户聊天的具体内容,服务器自动生成的数据也称为头部数据,为用户发送聊天数据时的生成日期或生成时刻等。

移动终端在接收到聊天数据以及头部数据后,会对这些数据进行显示。具体地,移动终端在接收到聊天数据以及头部数据后,会按照时间顺序将这些存储在同一个目标文件中,当显示某一项聊天数据或头部数据时,会从目标文件中依次查找各项聊天数据和头部数据,直到找到要显示的聊天数据或头部数据为止。

但由于目标文件中存储的数据量较大,移动终端在查找数据时的运算量较大,导致整个数据的显示过程的运算量变大。



技术实现要素:

本发明实施例的目的在于提供一种聊天数据的显示方法及装置,以降低数据显示的过程中的运算量。

为达到上述目的本发明实施例提供了一种聊天数据的显示方法,应用于移动终端,所述方法包括:

针对当前显示聊天列表视图的窗口,获得所述窗口对应的聊天数据,得到聊天数据集合;

确定所述聊天数据中每一个聊天数据对应的头部数据,得到头部数据集合;

确定所述聊天数据中每一个聊天数据在所述聊天数据集合中的第一位置以及所述头部数据中每一个头部数据在所述头部数据集合中的第二位置;

确定待显示聊天数据的起始位置或终止位置;

根据所述窗口的高度和宽度、针对头部数据和项聊天数据的预设显示规则、所述第一位置、所述第二位置以及所述起始位置或所述终止位置,确定待显示的项聊天数据以及待显示的头部数据;

显示所确定的待显示的项聊天数据以及所确定的待显示的头部数据。

本发明实施例还提供了一种聊天数据的显示装置,应用于移动终端,所述装置包括:

第一获取模块,用于针对当前显示聊天列表视图的窗口,获得所述窗口对应的聊天数据,得到聊天数据集合;

第二获取模块,用于确定所述聊天数据中每一个聊天数据对应的头部数据,得到头部数据集合;

第一确定模块,用于确定所述聊天数据中每一个聊天数据在所述聊天数据集合中的第一位置以及所述头部数据中每一个头部数据在所述头部数据集合中的第二位置;

第二确定模块,用于确定待显示聊天数据的起始位置或终止位置;

第三确定模块,用于根据所述窗口的高度和宽度、针对头部数据和项聊天数据的预设显示规则、所述第一位置、所述第二位置以及所述起始位置或所述终止位置,确定待显示的项聊天数据以及待显示的头部数据;

显示模块,用于显示所确定的待显示的项聊天数据以及所确定的待显示的头部数据。

本发明实施例提供的一种聊天数据的显示方法及装置,将聊天数据和头部数据进行分别存储在聊天数据集合和头部数据集合中,并为各聊天数据设置第一位置,为各头部数据分别第二位置,在显示待显示的项聊天数据以及待显示的头部数据时,可通过查询相应位置确定对应的项聊天数据或头部数据,较现有技术中的直接查询项聊天数据或头部数据的方法,查找数据时的运算量小;同时,本发明实施例通过分开存储聊天数据和头部数据的方法,在查询聊天数据或头部数据时,较现有技术中在目标文件中查询的方式,减小了查询聊天数据或头部数据的次数,减小了查找数据时的运算量。因此,本发明实施例可减小查找数据时的运算量,进而降低数据显示的过程中的运算量。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的聊天数据的显示方法的流程图;

图2为本发明实施例提供的确定待显示的项聊天数据以及待显示的头部数据的第一种流程图;

图3为本发明实施例提供的确定待显示的项聊天数据以及待显示的头部数据的第二种流程图;

图4为本发明实施例提供的聊天列表视图显示效果的第一种示意图;

图5为本发明实施例提供的聊天列表视图显示效果的第二种示意图;

图6为本发明实施例提供的聊天列表视图显示效果的第三种示意图;

图7为本发明实施例提供的聊天列表视图显示效果的第四种示意图;

图8为本发明实施例提供的聊天数据的显示装置的结构示意图;

图9为本发明实施例提供的第三确定模块的第一种结构示意图;

图10为本发明实施例提供的第三确定模块的第二种结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

为了解决现有技术问题,本发明实施例提供了一种聊天数据的显示方法及装置。下面首先对本发明实施例所提供的一种聊天数据的显示方法进行介绍。

需要说明的是,本发明的实施例优选适用于安装了iOS操作系统(iOS是由苹果公司开发的手持设备操作系统)、或安卓操作系统(Android系统是一种基于Linux的自由及开放源代码的操作系统)、或Windows Phone操作系统(Windows Phone是微软公司发布的一款手机操作系统)的移动终端,当然也适用于其他移动终端,本发明对此不作限定。

图1为本发明实施例提供的聊天数据的显示方法的流程图,可以包括:

S110,针对当前显示聊天列表视图的窗口,获得所述窗口对应的聊天数据,得到聊天数据集合。

需要说明的是,用户通过移动终端进行聊天后,会生成一些数据,这些数据显示在移动终端屏幕的窗口上,形成聊天列表视图。聊天列表视图中包含用户的聊天内容(即聊天数据)以及服务器自动生成的数据(如聊天内容的生成日期或生成时刻)。当用户通过移动终端发送和接收聊天数据后,移动终端会将这些聊天信息以及接收到的服务器自动生成的数据,按照时间顺序存储在一个目标文件中。

移动终端在显示某一项聊天数据或服务器自动生成的数据之前,需要在目标文件中进行查找,由于目标文件中存储的数据量较大,要查找到相应的聊天数据或头部数据,运算量较大。为了便于查找数据,减小运算量,移动终端将聊天数据和服务器自动生成的数据存储在目标文件中后,对每一个聊天数据或服务器自动生成的数据均设置角标,在查询数据时,只需要查询对应的角标,找到正确的角标后选择该角标对应的数据进行显示即可。优选地,角标可以为ID信息。

本实施例中,聊天数据包括目标文件中所有的聊天数据,并非仅包括当前窗口中正在显示的聊天数据。

当前窗口可以为用户正在聊天的窗口(如QQ聊天窗口),也可以为显示历史聊天列表视图的窗口(如消息记录窗口)。如果当前窗口为显示历史聊天列表视图的窗口,则聊天数据包括实时接收到的聊天内容;如果当前窗口为显示历史聊天列表视图的窗口,则聊天数据包括历史聊天数据。

具体地,当用户打开某一个窗口后,移动终端会查找该窗口对应的目标文件,并从目标文件中获取所有的聊天数据,并将获取的聊天数据以及各聊天数据对应的角标,进行存储构成聊天数据集合。

S120,确定所述聊天数据中每一个聊天数据对应的头部数据,得到所述头部数据集合。

本实施例中,头部数据可以为服务器自动生成的各聊天数据对应的生成日期或生成时刻,每一个聊天数据都对应一个头部数据,每个头部数据可以对应多个聊天数据,本实施例的头部数据包括目标文件中所有的头部数据。

具体地,在获取目标文件中所有聊天数据后,对每一个聊天数据进行识别,确定各项聊天数据对应的头部信息,并将目标文件中的所有头部信息以及各头部数据对应的角标进行存储,构成头部数据集合。

S130,确定所述聊天数据中每一个聊天数据在所述聊天数据集合中的第一位置以及所述头部数据中每一个头部数据在所述头部数据集合中的第二位置。

具体地,在构建了聊天数据集合与头部数据集合后,通过角标可实现聊天数据集合与目标文件之间的双向关联,以及头部数据集合与目标文件之间的双向关联,即通过聊天数据在目标文件中的角标可知道该项聊天数据在聊天数据集合中的角标(即该项聊天数据在聊天数据集合中的第一位置),可通过聊天数据聊天数据集合中的角标可知道该项聊天数据在目标文件中的角标;以及,通过头部数据在目标文件中的角标可知道该头部数据在头部集合中的角标(即该头部数据在头部数据集合中的第二位置),可通过头部数据在头部集合中的角标可知道该头部数据在目标文件中的角标。

S140,确定待显示聊天数据的起始位置或终止位置。

具体地,为了实现聊天数据的显示过程,可以采用由上向下的显示方式在窗口中显示聊天数据,也可以采用由下向上的显示方式在窗口中显示聊天数据。

举例而言,采用由上向下的显示方式在窗口中显示聊天数据表示为:以窗口的顶端为起点,显示聊天数据集合中的某一项聊天数据(如所有聊天数据中的第一项聊天数据),并由上向下依次显示聊天数据集合中该项聊天数据以后的聊天数据;采用由下向上的显示方式在窗口中显示聊天数据表示为:以窗口的底端为终点,显示聊天数据集合中的某一项聊天数据(如所有聊天数据中的最后一项聊天数据),并由下向上依次显示聊天数据集合中该项聊天数据之前的聊天数据。

当采用由上向下的显示方式在窗口中显示聊天数据时,可以将聊天数据集合中的某一项聊天数据(如所有聊天数据中的第一项聊天数据)作为起始聊天数据,将该起始聊天数据对应的角标确定为起始位置;当采用由下向上的显示方式在窗口中显示聊天数据时,可以将聊天数据集合中的某一项聊天数据(如所有聊天数据中的最后一项聊天数据)作为终止聊天数据,将该终止聊天数据对应的角标确定为终止位置。

S150,根据所述窗口的高度和宽度、针对头部数据和项聊天数据的预设显示规则、所述第一位置、所述第二位置以及所述起始位置或所述终止位置,确定待显示的项聊天数据以及待显示的头部数据。

具体地,由于每项聊天数据为该项聊天数据对应的头部数据的项,则可将其命名为项聊天数据。

预设显示规则包括头部数据的显示高度、项聊天数据的显示高度、字体显示大小、图片显示大小等等。

具体地,根据起始位置或终止位置可确定窗口顶部或底部对应的待显示的项聊天数据和待显示的头部数据,然后根据预设显示规则确定待显示的项聊天数据或待显示的头部数据的显示长度及高度,然后根据第一位置和第二位置确定由上向下或由下向上依次显示的其他待显示的项聊天数据或待显示的头部数据,并根据窗口的高度和宽度确定整个窗口内待显示的项聊天数据和待显示的头部数据的数量,最终可确定整个窗口内的待显示的项聊天数据以及待显示的头部数据。

S160,显示所确定的待显示的项聊天数据以及所确定的待显示的头部数据。

具体地,在确定了待显示的项聊天数据以及待显示的头部数据后,移动终端需要在聊天数据集合或头部数据集合中查找相应的数据,并显示在窗口上。

以头部数据为例,设要显示的某一个头部数据在目标文件中的角标位于第150个,将该头部数据存储在头部数据集合后,在头部数据集合中的角标(即第二位置)位于第30个,按照现有的方法,移动终端需要在目标文件中依次查找各头部数据,当查找到第150个时,可找到该头部数据并显示在窗口上;而本实施例中,移动终端需要在头部数据集合中依次查找各角标,当查找到第30个后,选择该角标对应的头部数据即为要查找的头部数据并显示在窗口上。

本实施例采用将头部数据和项聊天数据进行分开存储的方式,存储在两个不同的集合内,可降低查找待显示的项聊天数据以及待显示的头部数据时的次数,尤其当用户查看聊天记录时,用户在滑动操作时,移动终端需要频繁的查找待显示的项聊天数据以及待显示的头部数据,这将大大减小查询的运算量;同时,相对于头部数据和项聊天数据而言,角标的数据量较小,采用查找角标的方式,较直接查找待显示的项聊天数据以及待显示的头部数据的方式,使查询的运算量更小。

本发明实施例提供的聊天数据的显示方法,对于用户正在聊天的窗口,移动终端实时接收聊天数据和服务器自动生成的数据,并根据这些数据确定待显示的项聊天数据和头部数据,然后显示确定的待显示的项聊天数据和待显示的头部数据。因此,可将整个过程看做实时进行的过程。

而对于用户查看聊天记录的窗口,可将步骤S110-S130作为移动终端预先处理的过程:目标文件中存储着全部的聊天数据和服务器自动生成的数据,根据这些数据可预先得到存储聊天数据以及聊天数据角标的聊天数据集合、存储头部数据以及头部数据角标的头部数据集合、每一个聊天数据在聊天数据集合中的第一位置以及每一个头部数据在所述头部数据集合中的第二位置;当用户打开聊天记录的窗口,移动终端执行步骤S140-S160:确定待显示聊天数据的起始位置或终止位置,根据窗口的高度和宽度、针对头部数据和项聊天数据的预设显示规则、第一位置、第二位置以及起始位置或终止位置,确定待显示的项聊天数据以及待显示的头部数据,在确定了待显示的项聊天数据以及待显示的头部数据后,移动终端需要在聊天数据集合或头部数据集合中查找相应的角标,并选择角标对应的项聊天数据或头部数据进行显示,减小了查找数据时的运算量。同时,本发明实施例通过分开存储聊天数据和头部数据的方法,在查询聊天数据或头部数据时,较现有技术中在目标文件中查询的方式,减小了查询聊天数据或头部数据的次数,减小了查找数据时的运算量。因此,本发明实施例可减小查找数据时的运算量,进而降低数据显示的过程中的运算量。

为了便于理解S150的具体实现过程,S150可包括如下A、B两种具体实现方式:

A、根据所述窗口的高度和宽度、针对头部数据和项聊天数据的预设显示规则、所述第一位置、所述第二位置以及所述起始位置,确定待显示的项聊天数据以及待显示的头部数据。

B、根据所述窗口的高度和宽度、针对头部数据和项聊天数据的预设显示规则、所述第一位置、所述第二位置以及所述终止位置,确定待显示的项聊天数据以及待显示的头部数据。

为了便于理解A、B两种方式具体实现过程,方式A可包括如图2所示的方法,方式B可包括如图3所示的方法。

图2为本发明实施例提供的确定待显示的项聊天数据以及待显示的头部数据的第一种流程图,该方法包括:

S151a、将所述起始位置对应的项聊天数据,确定为第一个待显示的项聊天数据。

为了实现项聊天数据和头部数据的显示过程,本实施例中,采用由上向下的显示方式。具体地,在确定了待显示聊天数据的起始位置后,可从聊天数据集合中查找该起始位置对应的角标(即第一位置),找到该角标对应的项聊天数据,并将其作为由上向下进行显示的第一个待显示的项聊天数据。

S152a、将所述起始位置对应的聊天数据对应的头部数据,确定为第一个待显示的头部数据。

具体地,根据聊天数据集合与目标文件的关联性,以及目标文件与头部集合的关联性,确定起始位置对应的头部数据的角标(即第二位置),在头部集合中查找该角标,并找到该角标对应的头部数据,将该头部数据作为第一个待显示的头部数据。

S153a、根据所述窗口的高度和宽度以及针对头部数据和项聊天数据的预设显示规则,判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过所述窗口的高度。如果是,执行步骤S158a,确定显示高度等于窗口高度的当前待显示的项聊天数据和当前待显示的头部数据;如果否,执行步骤S154a。

具体地,将获取的第一个待显示的项聊天数据作为当前待显示的项聊天数据,将获取的第一个待显示的头部数据作为当前待显示的头部数据,根据窗口的宽度、针对头部数据和项聊天数据的预设显示规则,可确定当前待显示的项聊天数据和当前待显示的头部数据的显示高度。举例而言,设当前待显示的项聊天数据中包含有20个汉字,预设显示规则中要求显示每个汉字的宽度为1厘米,窗口的宽度为10厘米,则该项聊天数据需要在窗口中显示两行;如果预设显示规则中要求每一行的显示高度为1厘米,则该项聊天数据需要在窗口中显示高度为2厘米。

具体地,根据所述窗口的高度,判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过所述窗口的高度。举例而言,设当前显示的项聊天数据的显示高度为2厘米,当前待显示的头部数据的显示高度的显示高度为1厘米,窗口的高度为10厘米,则判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度没有超过窗口的高度。

具体地,如果当前待显示的项聊天数据和当前待显示的头部数据的显示高度超过窗口的高度,则确定等于窗口高度的当前待显示的项聊天数据和当前待显示的头部数据,具体的确定方式为现有技术此处不再赘述。

S154a、根据所述第一位置,确定当前所确定的待显示的项聊天数据的下一项聊天数据。

具体的,如果当前待显示的项聊天数据和当前待显示的头部数据的显示高度没有超过窗口的高度,则根据当前待显示的项聊天数据在聊天数据集合中的角标(第一位置),按照角标的顺序查找该角标的下一个角标,并确定下一个角标对应的下一项聊天数据。

S155a、根据所述第二位置,判断所述下一项聊天数据对应的头部数据与该项聊天数据的前一项聊天数据对应的头部数据是否相同;如果不相同,执行步骤S156a;如果相同,执行步骤S157a。

本实施例中,判断下一项聊天数据对应的头部数据与该项聊天数据的前一项聊天数据对应的头部数据是否相同的方式,可通过直接比对头部数据的方式实现;还可以通过判断二者的角标是否相同的方式实现,避免了直接比对头部数据时对头部数据的计算,减小了运算量。

具体的,在确定了下一项聊天数据后,确定该下一项聊天数据在聊天数据集合中的角标,根据聊天数据集合与目标文件的关联性,以及目标文件与头部集合的关联性,查找该角标对应的头部集合中的角标(即第二位置),并判断查找到的角标与该项聊天数据的前一项聊天数据对应的头部数据在头部集合中的角标是否相同。

S156a、将所述下一项聊天数据对应的头部数据,确定为下一个待显示的头部数据;根据所述窗口的高度和宽度以及针对头部数据和项聊天数据的预设显示规则,判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过所述窗口的高度。如果不超过,执行步骤S159a,将所述下一项聊天数据,确定为下一个待显示的项聊天数据;返回所述根据所述第一位置,确定当前所确定的待显示的项聊天数据的下一项聊天数据继续执行;

具体的,如果判断出下一项聊天数据对应的头部数据与该下一项聊天数据的前一项聊天数据对应的头部数据不同,则说明接下来待显示的项聊天数据不属于当前待显示的头部数据下的项聊天数据,则接下来将要显示下一个头部数据,因此,将该下一项聊天数据对应的头部数据,确定为下一个待显示的头部数据。

将确定的下一个待显示的头部数据作为当前待显示的头部数据,然后继续判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过窗口的高度。如果超过,执行步骤S158a,确定显示高度等于窗口高度的当前待显示的项聊天数据和当前待显示的头部数据。如果不超过,则接下来将要显示下一个待显示的头部数据下的项聊天数据,因此,此处可将下一项聊天数据,确定为下一个待显示的项聊天数据,将该项聊天数据作为当前待显示的项聊天数据,并返回步骤S154a。

需要说明的是,本实施例中的当前待显示的项聊天数据或当前待显示的头部数据并非只是一个项聊天数据或头部数据,而是之前确定的窗口对应的所有项聊天数据或头部数据。

S157a、将所述下一项聊天数据,确定为下一个待显示的项聊天数据;根据所述窗口的高度和宽度以及针对头部数据和项聊天数据的预设显示规则,判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过所述窗口的高度;如果不超过,返回步骤S154b,继续执行所述根据所述第一位置,确定当前所确定的待显示的项聊天数据的下一项聊天数据的步骤。

具体的,如果判断出下一项聊天数据对应的头部数据与该下一项聊天数据的前一项聊天数据对应的头部数据相同,则说明接下来要显示的项聊天数据属于当前待显示的头部数据下的项聊天数据,因此,可将该下一项聊天数据确定为下一个待显示的项聊天数据。

将确定的下一个待显示的项聊天数据作为当前待显示的项聊天数据,然后继续判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过窗口的高度。如果超过,执行步骤S158a,确定显示高度等于窗口高度的当前待显示的项聊天数据和当前待显示的头部数据。如果不超过,将下一项聊天数据,确定为当前待显示的项聊天数据,并返回步骤S154a。

图3为本发明实施例提供的确定待显示的项聊天数据以及待显示的头部数据的第二种流程图,该方法包括:

S151b、将所述终止位置对应的项聊天数据,确定为第一个待显示的项聊天数据。

为了实现项聊天数据和头部数据的显示过程,本实施例中,采用由下向上的显示方式。具体地,在确定了待显示聊天数据的终止位置后,可从聊天数据集合中查找该终止位置对应的角标(即第一位置),找到该角标对应的项聊天数据,并将其作为由下向上进行显示的第一个待显示的项聊天数据。

S152b、将所述终止位置对应的聊天数据对应的头部数据,确定为第一个待显示的头部数据。

具体地,根据聊天数据集合与目标文件的关联性,以及目标文件与头部集合的关联性,确定终止位置对应的头部数据的角标(即第二位置),在头部集合中查找该角标,并找到该角标对应的头部数据,将该头部数据作为第一个待显示的头部数据。

S153b、根据所述窗口的高度和宽度以及针对头部数据和项聊天数据的预设显示规则,判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过所述窗口的高度。如果是,执行步骤S158b,确定显示高度等于窗口高度的当前待显示的项聊天数据和当前待显示的头部数据;如果否,执行步骤S154b。

具体地,步骤S153b的内容与步骤S153a的内容相同。

S154b、根据所述第一位置,确定当前所确定的待显示的项聊天数据的前一项聊天数据。

具体的,如果当前待显示的项聊天数据和当前待显示的头部数据的显示高度没有超过窗口的高度,则根据当前待显示的项聊天数据在聊天数据集合中的角标(第一位置),按照角标的顺序查找该角标的前一个角标,并确定前一个角标对应的前一项聊天数据。

S155b、根据所述第二位置,判断所述前一项聊天数据对应的头部数据与该项聊天数据的下一项聊天数据对应的头部数据是否相同;如果不相同,执行步骤S156b;如果相同,执行步骤S157b。

本实施例中,判断前一项聊天数据对应的头部数据与该项聊天数据的下一项聊天数据对应的头部数据是否相同的方式,可通过直接比对头部数据的方式实现;还可以通过判断二者的角标是否相同的方式实现,避免了直接比对头部数据时对头部数据的计算,减小了运算量。

具体的,在确定了前一项聊天数据后,确定该前一项聊天数据在聊天数据集合中的角标,根据聊天数据集合与目标文件的关联性,以及目标文件与头部集合的关联性,查找该角标对应的头部集合中的角标(即第二位置),并判断查找到的角标与该项聊天数据的下一项聊天数据对应的头部数据在头部集合中的角标是否相同。

S156b、将所述前一项聊天数据对应的头部数据,确定为下一个待显示的头部数据;根据所述窗口的高度和宽度以及针对头部数据和项聊天数据的预设显示规则,判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过所述窗口的高度。如果不超过,执行步骤S159b,将所述前一项聊天数据,确定为下一个待显示的项聊天数据;返回所述根据所述第一位置,确定当前所确定的待显示的项聊天数据的前一项聊天数据继续执行。

具体的,如果判断出前一项聊天数据对应的头部数据与该前一项聊天数据的下一项聊天数据对应的头部数据不同,则说明接下来待显示的项聊天数据不属于当前待显示的头部数据下的项聊天数据,则接下来将要显示下一个头部数据,因此,将该前一项聊天数据对应的头部数据,确定为下一个待显示的头部数据。

将确定的下一个待显示的头部数据作为当前待显示的头部数据,然后继续判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过窗口的高度。如果超过,执行步骤S158b,确定显示高度等于窗口高度的当前待显示的项聊天数据和当前待显示的头部数据。如果不超过,则接下来将要显示前一个待显示的头部数据下的项聊天数据,因此,此处可将前一项聊天数据,确定为下一个待显示的项聊天数据,将该项聊天数据作为当前待显示的项聊天数据,并返回步骤S154b。

需要说明的是,本实施例中的当前待显示的项聊天数据或当前待显示的头部数据并非只是一个项聊天数据或头部数据,而是之前确定的窗口对应的所有项聊天数据或头部数据。

S157b、将所述前一项聊天数据,确定为下一个待显示的项聊天数据;根据所述窗口的高度和宽度以及针对头部数据和项聊天数据的预设显示规则,判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过所述窗口的高度。如果不超过,返回步骤S154b,继续执行所述根据所述第一位置,确定当前所确定的待显示的项聊天数据的前一项聊天数据的步骤。

具体的,如果判断出前一项聊天数据对应的头部数据与该前一项聊天数据的下一项聊天数据对应的头部数据相同,则说明接下来要显示的项聊天数据属于当前待显示的头部数据下的项聊天数据,因此,可将该前一项聊天数据确定为下一个待显示的项聊天数据。

将确定的下一个待显示的项聊天数据作为当前待显示的项聊天数据,然后继续判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过窗口的高度。如果超过,执行步骤S158b,确定显示高度等于窗口高度的当前待显示的项聊天数据和当前待显示的头部数据。如果不超过,将前一项聊天数据确定为当前待显示的项聊天数据,并返回步骤S154b。

优选地,预设显示规则还可以包括头部数据的显示位置。当用户执行滑动操作时,头部数据的显示位置不同,根据步骤S151a-S157a或者步骤S151b-S157b,可实现图4至图7所示的不同显示效果的聊天列表视图。

如图4至图7所示,四者均为同一窗口中的聊天列表视图,其中,项聊天数据可以为文字类型、图片类型、音频类型、视频类型、红包类型中的一种或几种组合的数据,头部数据为项聊天数据的生成时刻。其中,设头部数据的显示高度为0.5厘米,文字类型的显示高度为1厘米,图片类型的显示高度为3.5厘米、音频类型的显示高度为1.5厘米,视频类型的显示高度为2厘米,红包类型的显示高度为1.5厘米。

图4为本发明实施例提供的聊天列表视图显示效果的第一种示意图,如图4所示,头部数据(如上午11:16、上午11:18等)的显示位置为窗口中的可变的区域,头部数据位于其下的所有项聊天数据的上方,当用户执行滑动操作时,头部数据和项数据在显示时,给用户的感觉为共同向上或向下移动。

图5为本发明实施例提供的聊天列表视图显示效果的第二种示意图,如图5所示,窗口的顶端处设置有一个显示头部数据的区域(命名为目标区域),该目标区域内显示的头部数据为经过目标区域的项聊天数据或头部数据对应的头部数据。举例而言,项聊天数据“在吗”部分经过目标区域时(实际上,项聊天数据“在吗”的上半部分经过目标区域并被头部数据遮挡),该目标区域内显示的头部数据为项聊天数据“在吗”对应的头部数据“上午11:16”。

图6为本发明实施例提供的聊天列表视图显示效果的第三种示意图,当头部数据“上午11:16”下的最后一项聊天数据经过目标区域时(此时最后一项聊天数据被目标区域完全覆盖),当前的头部数据“上午11:16”和下一头部数据“上午11:18”相邻。

图7为本发明实施例提供的聊天列表视图显示效果的第四种示意图,当头部数据“上午11:18”以及该头部数据下的项聊天数据经过目标区域后,头部数据作为当前的头部数据显示在目标区域内。

由图5-图7可以看出,在窗口上固定设置有显示头部数据的目标区域后,当某一个头部数据以及该头部数据下的项聊天数据经过目标区域时,目标区域会显示该头部数据,给用户呈现了一种头部数据悬停的效果。

本实施例提供的聊天数据的显示方法,可通过对StickyListHeadersListview开源控件源码进行阅读,实现复杂数据来源的尽简洁的处理,并修改头部布局出现时机的判断,使其判断过程简化,增加项聊天数据的种类,使得此控件能够适用各种简单或者复杂的应用场景。

具体地,首先获取到StickyListHeadersListView对象,然后编写Adapter对象与之关联,StickyListHeadersListView被添加到屏幕上准备开始渲染时,底层会调用onMeasure()函数和onLayout()函数,并执行layoutChild()函数。而在此之前,在getSectionLettersAndIndices()函数中通过对数据来源进行遍历,分离出头部数据mSectionTop,并调用getSections()函数得到头部数据的集合。然后通过利用getPositionForSectin()函数实现从某个头部数据或项聊天数据在头部数据集合或聊天数据集合中的角标得到该头部数据或项聊天数据在整个聊天列表视图中的角标,利用getSectionForPosition()函数实现某个头部数据或项聊天数据在整个listview中的角标得到该头部数据或项聊天数据在头部数据集合或聊天数据集合中的角标,使DualHashMap(放置对象的双向关联集合)中数据的存取显示的双向关联管理进行了整合,只要知道头部数据或项聊天数据的角标就可以得到相应的头部数据或项聊天数据,使数据来源的处理过程更加简洁。

其中,onMeasure()函数的代码为:

protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec){

int measuredWidth=MeasureSpec.getSize(widthMeasureSpec);

int childWidthMeasureSpecMeasureSpec.makeMeasureSpec(measuredWidth,

MeasureSpec.EXACTLY);int measuredHeight=0;

if(mHeader!=null){LayoutParams params=mHeader.getLayoutParams();

if(params!=null&&params.height>0){

mHeader.measure(childWidthMeasureSpec,

MeasureSpec.makeMeasureSpec(params.height,MeasureSpec.EXACTLY));

}else{mHeader.measure(childWidthMeasureSpec,

MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED));}

measuredHeight+=mHeader.getMeasuredHeight();}else if(mDivider!=null&&mItem.getVisibility()!=View.GONE){measuredHeight+=mDividerHeight;

}LayoutParams params=mItem.getLayoutParams();

if(mItem.getVisibility()==View.GONE){mItem.measure(childWidthMeasureS pec,MeasureSpec.makeMeasureSpec(0,MeasureSpec.EXACTLY));

}else if(params!=null&&params.height>=0){

mItem.measure(childWidthMeasureSpec,

MeasureSpec.makeMeasureSpec(params.height,MeasureSpec.EXACTLY));

measuredHeight+=mItem.getMeasuredHeight();

}else{mItem.measure(childWidthMeasureSpec,

MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED));

measuredHeight+=mItem.getMeasuredHeight();}

setMeasuredDimension(measuredWidth,measuredHeight);}

onLayout()函数的代码为:

protected void onLayout(boolean changed,int l,int t,int r,int b){

l=0;t=0;r=getWidth();b=getHeight();if(mHeader!=null){

int headerHeight=mHeader.getMeasuredHeight();

mHeader.layout(l,t,r,headerHeight);

mItemTop=headerHeight;mItem.layout(l,headerHeight,r,b);

}else if(mDivider!=null){mDivider.setBounds(l,t,r,mDividerHeight);

mItemTop=mDividerHeight;mItem.layout(l,mDividerHeight,r,b);

}else{mItemTop=t;mItem.layout(l,t,r,b);}}

layoutChildren()函数的代码为:

protected void layoutChildren(){if(!mBlockcChildren){

super.layoutChildren();}}

其中,BlockLayoutChildren()的代码为:

public void setBlockLayoutChildren(boolean block){mBlockLayoutChildren=block;}

getSectionLettersAndIndices()函数的代码为:

private void getSectionLettersAndIndices(){if(list.size()==0){return;}

timeTemp=null;mSection_temp.clear();for(int i=0;i<list.size();i++){if(!TextUtils.isEmpty(timeTemp)&&i>0){

if(TimeUtil.isSameMinutes(list.get(i).getSend_Time(),timeTemp)){

mSection_temp.add("″+i);}}else if(i==0){mSection_temp.add(""+0);

}imeTemp=list.get(i).getSend_Time();}

mSectionTop=new String[mSection_temp.size()];for(int i=0;i<mSection_temp.size();i++){mSectionTop[i]=mSection_temp.get(i)+"";}}

getSections()函数的代码为:

public Object[]getSections(){return mSectionTop;}

getPositionForSection()函数的代码为:

public int getPositionForSection(int sectionIndex){if(mSectionTop.length==0){return 0;}if(sectionIndex>=mSectionTop.length){sectionIndex=mSectionTop.length-1;}else if(sectionIndex<0){sectionIndex=0;}

return Integer.parseInt(mSectionTop[sectionIndex]);}

getSectionForPosition()函数的代码为:

public int getSectionForPosition(int position){for(int i=0;i<mSectionTop.length;i++){if(position<Integer.parseInt(mSectionTop[i])){return i-1;}}return mSectionTop.length-1;}

其次,通过getHeaderId()确定头部数据的出现时机,如果当前的头部数据的角标和前一个头部数据的角标不同时,就会显示头部数据。具体地,首先设置一个返回的默认值为0,以回避用户滑动操作的时候由于从头部数据集合中查找头部数据的角标很大,造成头部数据的多余错误显示,当返回的数据过大超出聊天列表视图中所有数据的总个数时,会直接返回默认值0,在滑动停止后再次调用getHeaderId()函数,此时就会正常返回头部数据。然后,设置角标不为0且数组长度大于角标的判断,以避免角标为0的情况的重复处理,简化了代码。

其中,getHeaderId()函数的代码为:

public long getHeaderId(int position){long headerid=position;if(position!=0&&list.size()>=position){

headerid=TimeUtil.timeToLongTime(list.get(position).getSend_Time());}

return headerid;}

最后,通过getHeaderView()函数加载头部数据和项聊天数据。本实施中,可利用简单视图原生函数adapter()函数显示载头部数据和项聊天数据。当项聊天数据多样时,可调用getViewTypeCount()函数预设多种类型的项聊天数据,再经过getItemViewType()函数查找相应项聊天数据的角标,确定该项聊天数据的类型,然后在getView中显示相应类型的项聊天数据。

其中,getHeaderView()函数的代码为:

public View getHeaderView(int position,View convertView,ViewGroup parent){HeaderViewHolder holder;if(convertView==null){holder=new HeaderViewHolder();

convertView=LayoutInflater.from(context).inflate(R.layout.item_chat_live_hearder,null);

holder.text=(TextView)convertView.findViewById(R.id.text);

holder.text_add=(TextView)convertView.findViewById(R.id.text_add);

convertView.setTag(holder);}else{

holder=(HeaderViewHolder)convertView.getTag();}

String temp=list.get(position).getSend_Time();holder.text.setText(temp);

return convertView;}

具体地,可通过如下代码实现多种类型项聊天数据的显示:

public int getItemViewType(int position){ChatMessageBean bean=list.get(position);if(bean.getMessage_Type().equals("0")){

return text_view;}else if(bean.getMessage_Type().equals("1")){return img_view;}else if(bean.getMessage_Type().equals("2")){return voice_view;

}else if(bean.getMessage_Type().equals("3")){

return red_view;}else if(bean.getMessage_Type().equals("4")){

return media_view;}return-1;}

public int getViewTypeCount(){return 5;}

private View creatview(String type){View view=null;switch(type){case"0":view=LayoutInflater.from(context).inflate(R.layout.stick_list_new_text_item,null);break;case"1":

view=LayoutInflater.from(context).inflate(R.layout.stick_list_new_iamge_ite m,null);break;case"2":

view=LayoutInflater.from(context).inflate(R.layout.stick_list_new_voice_item,null);break;case"3":

view=LayoutInflater.from(context).inflate(R.layout.stick_list_new_rc_item,null);break;case"4":

view=LayoutInflater.from(context).inflate(R.layout.stick_list_new_media_ite m,null);break;}return view;}

public View getView(final int position,View convertView,ViewGroup parent){final ChatMessageBean bean=list.get(position);

ViewHold vh=null;if(convertView==null){vh=new ViewHold();

String type=bean.getMessage_Type();convertView=creatview(type);

switch(type){case"0":

vh.text_message_stick=(TextView)convertView.findViewById(R.id.text_mess age_stick);break;case"1":

vh.image_stick=(ImageView)convertView.findViewById(R.id.image_stick);break;case"2":

vh.voice_stick=(ImageView)convertView.findViewById(R.id.voice_stick);break;case"3":

vh.red_textview_stick=(TextView)convertView.findViewById(R.id.red_textvie w_stick);break;case"4":

vh.video_view_stick=(VideoPlayView)convertView.findViewById(R.id.video_view_stick);break;}

vh.input_item=(LinearLayout)convertView.findViewById(R.id.input_item);

convertView.setTag(vh);}else{vh=(ViewHold)convertView.getTag();}

switch(bean.getMessage_Type()){case"0":break;case"1":break;case"2":break;case"3":break;case"4":break;}return convertView;}

与上述的方法实施例相对应,本发明实施例还提供了一种聊天数据的显示装置。

图8为本发明实施例提供的聊天数据的显示装置的结构示意图,该装置包括:

第一获取模块810,用于针对当前显示聊天列表视图的窗口,获得所述窗口对应的聊天数据,得到聊天数据集合;

第二获取模块820,用于确定所述聊天数据中每一个聊天数据对应的头部数据,得到头部数据集合;

第一确定模块830,用于确定所述聊天数据中每一个聊天数据在所述聊天数据集合中的第一位置以及所述头部数据中每一个头部数据在所述头部数据集合中的第二位置;

第二确定模块840,用于确定待显示聊天数据的起始位置或终止位置;

第三确定模块850,用于根据所述窗口的高度和宽度、针对头部数据和项聊天数据的预设显示规则、所述第一位置、所述第二位置以及所述起始位置或所述终止位置,确定待显示的项聊天数据以及待显示的头部数据;

显示模块860,用于显示所确定的待显示的项聊天数据以及所确定的待显示的头部数据。

本发明实施例提供的一种聊天数据的显示装置,将聊天数据和头部数据进行分别存储在聊天数据集合和头部数据集合中,并为各聊天数据设置第一位置,为各头部数据分别第二位置,在显示待显示的项聊天数据以及待显示的头部数据时,可通过查询相应位置确定对应的项聊天数据或头部数据,较现有技术中的直接查询项聊天数据或头部数据的方法,查找数据时的运算量小;同时,本发明实施例通过分开存储聊天数据和头部数据的方法,在查询聊天数据或头部数据时,较现有技术中在目标文件中查询的方式,减小了查询聊天数据或头部数据的次数,减小了查找数据时的运算量。因此,本发明实施例可减小查找数据时的运算量,进而降低数据显示的过程中的运算量。

优选地,所述项聊天数据为包含以下数据类型中的一种或几种组合的数据:

文字类型、图片类型、音频类型、视频类型、红包类型。

图9为本发明实施例提供的第三确定模块的第一种结构示意图,所述第三确定模块850,包括:

第一确定单元851a,用于将所述起始位置对应的项聊天数据,确定为第一个待显示的项聊天数据;

第二确定单元852a,用于将所述起始位置对应的聊天数据对应的头部数据,确定为第一个待显示的头部数据;

第一判断单元853a,用于根据所述窗口的高度和宽度以及针对头部数据和项聊天数据的预设显示规则,判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过所述窗口的高度;当所述第一判断单元的判断结果为否时,触发第三确定单元854a;

所述第三确定单元854a,用于根据所述第一位置,确定当前所确定的待显示的项聊天数据的下一项聊天数据;

第二判断单元855a,用于根据所述第二位置,判断所述下一项聊天数据对应的头部数据与该项聊天数据的前一项聊天数据对应的头部数据是否相同;

第三判断单元856a,用于当所述第二判断单元855a的判断结果为不相同时,将所述下一项聊天数据对应的头部数据,确定为下一个待显示的头部数据;根据所述窗口的高度和宽度以及针对头部数据和项聊天数据的预设显示规则,判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过所述窗口的高度;如果不超过,触发第四确定单元854a;

所述第四确定单元859a,用于将所述下一项聊天数据,确定为下一个待显示的项聊天数据,并触发所述第三确定单元854a;

第四判断单元857a,用于当所述第二判断单元855a的判断结果为相同时,将所述下一项聊天数据,确定为下一个待显示的项聊天数据;根据所述窗口的高度和宽度以及针对头部数据和项聊天数据的预设显示规则,判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过所述窗口的高度;如果不超过,触发所述第三确定单元854a。

第一显示数据确定单元858a,用于当所述第一判断单元853a的判断结果为是时,或者,所述第三判断单元856a的判断结果为超过时,或者,所述第四判断单元857a的判断结果为超过时,确定显示高度等于窗口高度的当前待显示的项聊天数据和当前待显示的头部数据。

图10为本发明实施例提供的第三确定模块的第二种结构示意图,所述第三确定模块850,包括:

第五确定单元851b,用于将所述终止位置对应的项聊天数据,确定为第一个待显示的项聊天数据;

第六确定单元852b,用于将所述终止位置对应的聊天数据对应的头部数据,确定为第一个待显示的头部数据;

第五判断单元853b,用于根据所述窗口的高度和宽度以及针对头部数据和项聊天数据的预设显示规则,判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过所述窗口的高度;当所述第五判断单元的判断结果为否时,触发第七确定单元854b;

所述第七确定单元854b,用于根据所述第一位置,确定当前所确定的待显示的项聊天数据的前一项聊天数据;

第六判断单元855b,用于根据所述第二位置,判断所述前一项聊天数据对应的头部数据与该项聊天数据的下一项聊天数据对应的头部数据是否相同;

第七判断单元856b,用于当所述第六判断单元855b的判断结果为不相同时,将所述前一项聊天数据对应的头部数据,确定为下一个待显示的头部数据;根据所述窗口的高度和宽度以及针对头部数据和项聊天数据的预设显示规则,判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过所述窗口的高度;如果不超过,触发第八确定单元859b;

所述第八确定单元859b,用于将所述前一项聊天数据,确定为下一个待显示的项聊天数据,并触发所述第七确定单元854b;

第八判断单元857b,用于当所述第六判断单元855b的判断结果为相同时,将所述前一项聊天数据,确定为下一个待显示的项聊天数据;根据所述窗口的高度和宽度以及针对头部数据和项聊天数据的预设显示规则,判断当前待显示的项聊天数据和当前待显示的头部数据的显示高度是否超过所述窗口的高度;如果不超过,触发所述第七确定单元854b。

第二显示数据确定单元858b,用于当所述第五判断单元853b的判断结果为是时,或者,第七判断单元856b的判断结果为超过时,或者,所述第八判断单元857b的判断结果为超过时,确定显示高度等于窗口高度的当前待显示的项聊天数据和当前待显示的头部数据。

本实施例提供的聊天数据的显示装置,当某一个头部数据以及该头部数据下的项聊天数据经过目标区域时,目标区域会显示该头部数据,从而为用户呈现一种头部数据悬停的效果。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1