Как отобразить дату календаря в верхней части сообщений чата в соответствии с последним появлением сообщения на эту конкретную дату - PullRequest
0 голосов
/ 20 мая 2019

Привет, ребята, я создаю приложение для Android, которое содержит модуль обмена сообщениями. В этом модуле обмена сообщениями я хочу отображать дату таким образом, чтобы сообщения с той же датой находились в связке ниже определенной даты, так же, как там показаны WhatsApp и Telegram.дата сообщения

попытался найти эту проблему, но было трудно найти правильное рабочее решение, потому что я получаю сообщения из локальной базы данных sqlite как ORDER в DESC, чтобы сначала получить последнее сообщение, а затемустановка моего linearlayoumanager ReverseLayout в true (LayoutManager.ReverseLayout (true)) и stackFromEnd также в true, чтобы последнее сообщение находилось в нижнем элементе в recyclerview. Большинство решений, которые я получаю, имеют обратную форму, дата приходит в первый деньвхождение, а не вхождение последней даты, которое является последним сообщением, а не поступает при последнем изменении даты

Извлечение из sqlite:

SQLiteDatabase sqLiteDatabase=myDbHelper.getWritableDatabase();
            String rowQuery="SELECT " +
                    Database_Creation.MESSAGES_TABLE+"."+Database_Creation.MESSAGE+", "+
                    Database_Creation.MESSAGES_TABLE+"."+Database_Creation.MESSAGE_ID+", "+
                    Database_Creation.MESSAGES_TABLE+"."+Database_Creation.MESSAGE_PHONE_SENDER+", "+
                    Database_Creation.MESSAGES_TABLE+"."+Database_Creation.MESSAGE_PHONE_RECIEVER+", "+
                    Database_Creation.MESSAGES_TABLE+"."+Database_Creation.MESSAGE_DELEVERY_STATUS+", "+
                    Database_Creation.MESSAGES_TABLE+"."+Database_Creation.MESSAGE_TAG+", "+
                    Database_Creation.MESSAGES_TABLE+"."+Database_Creation.MESSAGE_TIME_STAMP+", "+
                    Database_Creation.MESSAGES_TABLE+"."+Database_Creation.MESSAGE_CONVERSATION_ID+", "+
                    Database_Creation.MESSAGES_TABLE+"."+Database_Creation.MESSAGE_TEXT_TYPE+", "+
                    Database_Creation.MESSAGES_TABLE+"."+Database_Creation.MESSAGE_IS_DOWNLOADED+", "+
                    Database_Creation.MESSAGES_TABLE+"."+Database_Creation.MESSAGE_TINY_FILE+", "+
                    Database_Creation.MESSAGE_FILE_TABLE+"."+Database_Creation.MESSAGE_File_NAME+", "+
                    Database_Creation.MESSAGE_FILE_TABLE+"."+Database_Creation.MESSAGE_FIle_SYNC_STATUS+", "+
                    Database_Creation.MESSAGE_FILE_TABLE+"."+Database_Creation.MESSAGE_FILE_MIME_TYPE+", "+
                    Database_Creation.MESSAGE_FILE_TABLE+"."+Database_Creation.MESSAGE_FIle_DELETED_STATUS+", "+
                    Database_Creation.MESSAGE_FILE_TABLE+"."+Database_Creation.MESSAGE_File_THUMBNAIL+", "+
                    Database_Creation.MESSAGE_FILE_TABLE+"."+Database_Creation.MESSAGE_FILE_ORIGINAL_NAME+", "+
                    Database_Creation.MESSAGE_TABLE_FUNCTIONS+"."+Database_Creation.MESSAGE_FUNTION_MESSAGE_ID_REFRENCE+", "+
                    Database_Creation.MESSAGE_TABLE_FUNCTIONS+"."+Database_Creation.MESSAGE_FUNTION+



                    " FROM "+Database_Creation.MESSAGES_TABLE+
                    " LEFT JOIN "+Database_Creation.MESSAGE_FILE_TABLE+" ON "+Database_Creation.MESSAGES_TABLE+"."+Database_Creation.MESSAGE_ID+" = "+Database_Creation.MESSAGE_FILE_TABLE+"."+Database_Creation.MESSAGE_FILE_MESSAGE_ID+
                    " LEFT JOIN "+Database_Creation.MESSAGE_TABLE_FUNCTIONS+" ON "+Database_Creation.MESSAGES_TABLE+"."+Database_Creation.MESSAGE_ID+" = "+Database_Creation.MESSAGE_TABLE_FUNCTIONS+"."+Database_Creation.MESSAGE_FUNTION_MESSAGE_ID+
                    " WHERE "+Database_Creation.MESSAGE_CONVERSATION_ID+"=? "
                    +"ORDER BY "+Database_Creation.MESSAGES_TABLE+"."+Database_Creation.MESSAGE_TIME_STAMP+" DESC" +
                    " LIMIT "+offset+","+itemcount;

recyclerver layoutmanager

        linearLayoutManager.setInitialPrefetchItemCount(2);
        rv_messages.setLayoutManager(linearLayoutManager);
        rv_messages.setHasFixedSize(true);
        rv_messages.setNestedScrollingEnabled(false);
        endlessScrollListener=new EndlessScrollListener(linearLayoutManager) {
            @Override
            public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
                Log.d(TAG,"new pag no:"+page);
                //populate_messages_add(conversation_id,page);
            }
        };
       rv_messages.addOnScrollListener(endlessScrollListener)

метод для генерациидата:


 private void processDate(@NonNull TextView tv, String dateAPIStr
            , String dateAPICompareStr
            , boolean isFirstItem) {

        SimpleDateFormat f = new SimpleDateFormat("dd MMM yy");
       if (isFirstItem) {
            //first item always got date/today to shows
            //and overkill to compare with next item flow
            Date dateFromAPI = null;
            try {
                dateFromAPI = f.parse(dateAPIStr);
                if (DateUtils.isToday(dateFromAPI.getTime())) tv.setText("today");
                else if (DateUtils.isToday(dateFromAPI.getTime() + DateUtils.DAY_IN_MILLIS)) tv.setText("yesterday");
                else tv.setText(dateAPIStr);
                tv.setIncludeFontPadding(false);
                tv.setVisibility(View.VISIBLE);
            } catch (ParseException e) {
                e.printStackTrace();
                tv.setVisibility(View.GONE);
            }
        } else {
            Log.d(TAG,"dateAPIStr:"+dateAPIStr+" dateAPICompareStr:"+dateAPICompareStr);
            if (!dateAPIStr.equalsIgnoreCase(dateAPICompareStr) || tv.getText()==null) {
                try {
                    Date dateFromAPI = f.parse(dateAPIStr);
                  //  if (DateUtils.isToday(dateFromAPI.getTime())) tv.setText("today");
                  //  else if (DateUtils.isToday(dateFromAPI.getTime() + DateUtils.DAY_IN_MILLIS)) tv.setText("yesterday");
                     tv.setText(dateAPIStr);
                    tv.setIncludeFontPadding(false);
                    tv.setVisibility(View.VISIBLE);
                } catch (ParseException e) {
                    e.printStackTrace();
                    tv.setVisibility(View.GONE);
                }
            } else {
                tv.setVisibility(View.GONE);
            //}
        }
    }

ожидаемый результат должен выглядеть следующим образом: image showing the required way

это так:

image showing the current way

ожидается группировка даты сообщений сверху вниз, но вместо этого группирует их снизу вверх

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...