【问题标题】:How to display a date like Whatsapp on scrolling ListView如何在滚动 ListView 上显示类似 Whatsapp 的日期
【发布时间】:2017-01-16 18:02:36
【问题描述】:

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

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

【问题讨论】:

    标签: android android-layout listview android-fragments android-adapter


    【解决方案1】:

    要像这个截图那样显示日期,你可以使用

    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
                }
    

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

    上面的代码是在ScrollListener的RecyclerView这个方法中添加的

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

    注意:此处tvDay 被添加到RecyclerView 可用的XML 中。 RecyclerViewtvDayRelativeLayouttvDay 的同一个子级,设置为 android:layout_centerHorizontal="true" 以使其保持在顶部中心。

    【讨论】:

    • 如何制作动画?
    • @AbhayKoradiya 你可以在滚动监听器中为这个布局设置动画。
    【解决方案2】:
                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);
                    }
    
                }
    

    【讨论】:

    • @ManishGupta 它只是比较日期并将匹配的视图添加到容器中,您需要一种方法来确定列表视图顶部显示的消息以及它的日期,比较它针对当前日期并添加一个显示信息的视图,没有通用的解决方案。
    猜你喜欢
    • 2018-08-31
    • 2022-11-07
    • 2014-10-22
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多