如何在滚动 ListView 上显示类似 Whatsapp 的日期

Man*_*pta 5 android listview android-layout android-adapter android-fragments

当我像在 WhatsApp 中一样滚动 ListView 时,如何在应用程序中显示日期?
为清楚起见,请参见下图:

在此处输入图片说明

当我滚动 ListView 时,日期显示在列表上。
如果您仍然不明白我的问题,请打开您的 WhatsApp,转到任何组并开始滚动:您将看到旧文本的日期显示。

在此处输入图片说明

Kis*_*nki 6

在此输入图像描述

要像此屏幕截图一样显示日期,您可以使用

val firstVisiblePosition = layoutManager.findFirstVisibleItemPosition()
if (getDateFromFirebaseTime(messageArrayList[firstVisiblePosition].timestamp.toString().toLong()).isNotEmpty()) {
                tvDay.visibility = View.VISIBLE
                tvDay.text = getDateFromFirebaseTime(messageArrayList[firstVisiblePosition].timestamp.toString().toLong())
            } else {
                tvDay.visibility = View.GONE
            }
Run Code Online (Sandbox Code Playgroud)

我在这里所做的是获取 RecyclerView 列表中第一个可见项目的索引,然后从该索引中获取消息的时间戳并使用该函数将其显示在TextView tvDay中getDateFromFirebaseTime()

以上代码添加在RecyclerView的ScrollListener的this方法中

override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
            super.onScrolled(recyclerView, dx, dy)
            Log.d("scroll", "scrolling")
            //added here
        }
Run Code Online (Sandbox Code Playgroud)

注意:此处tvDay添加到可用的 XML 中RecyclerViewRecyclerViewtvDay是同一个子元素RelativeLayouttvDay设置为android:layout_centerHorizontal="true"将其保持在顶部中心。


Shi*_*rma 0

            Calendar cal = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
            String strDate = sdf.format(cal.getTime());
            today = new String[user.length()];
            yesterday = new String[user.length()];
            earlier = new String[user.length()];
            int t_counter = 0;
            int y_counter = 0;
            int e_counter = 0;
            for (int i = 0; i < user.length(); i++) {
                JSONObject c = user.getJSONObject(i);
                post = c.getString(TAG_TEXT).toString();
                date = c.getString(TAG_DATE).toString();
                time = c.getString(TAG_TIME).toString();

                if (strDate.equals(c.getString(TAG_DATE.toString()))) {
                    if (t_counter == 0) {
                        TextView tv = getTextView(lp, "Today");
                        myLayout.addView(tv);
                        t_counter = t_counter + 1;
                    }
                    View msgView = generateChatView(post, time);
                    myLayout.addView(msgView);

                }
                try {
                    temp = sdf.parse(c.getString(TAG_DATE.toString()));
                    c_date = sdf.parse(strDate);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                if (c_date.getTime() - temp.getTime() == 86400000) {
                    if (y_counter == 0) {
                        TextView tv = getTextView(lp, "Yesterday");
                        myLayout.addView(tv);
                        ;
                        y_counter = y_counter + 1;
                    }
                    View msgView = generateChatView(post, time);
                    myLayout.addView(msgView);
                }
                if (c_date.getTime() - temp.getTime() > 86400000) {
                    if (e_counter == 0) {
                        TextView tv = getTextView(lp, "Earlier");
                        myLayout.addView(tv);
                        e_counter = e_counter + 1;
                    }
                    View msgView = generateChatView(post, time);
                    myLayout.addView(msgView);
                }

            }
Run Code Online (Sandbox Code Playgroud)