2017-09-01 62 views
1

我正在嘗試創建一個聊天機器人。我需要模擬來自應用程序的交互式響應。響應不是來自將其嵌入到應用程序中的切斷。 我使用recycleview來實現聊天界面,我需要延遲每個消息一段時間,以便用戶感覺有人正在與他交談。如何延遲添加元素到Recyclerview適配器?

private void displayNewMessage(ArrayList<ChatMessage> messages) { 
     for (int i = 0; i < messages.size(); i++) { 
      chatMessages.add(messages.get(i)); 
     } 
     adapter.notifyDataSetChanged(); 


    } 

上述方法用於向用戶推送消息數組,如何延遲將每個元素添加到適配器。或者將它們全部推送到適配器並延遲在適配器中自行顯示它們?

我試圖使用處理程序,但它沒有工作,它延遲了所有的消息,並將它們推在一起。

回答

0

在您添加數據arrat把delayedpost上回收並調用run方法內部通知後循環,這將模擬延遲爲每個郵件,而不是延遲,然後顯示在一次

0

您可以使用所有消息Handler.post延遲(新的Runnable(),3000); 你把你的代碼放在它們的runnable接口運行方法下,它將在延遲秒後開始。

+0

整個響應將被延遲的延遲秒,但隨後將被推一起到適配器。這是不模擬真正的聊天 –

2

這是一個比編程更合乎邏輯的問題。

起初爲什麼it delays all messages and pushes them all together - 因爲for循環,它會立即將它們添加到適配器。

另一種解決方案是在用戶發送消息線程的某些地方使用處理程序。

假設我們有用戶sendMessageButton我們可以在那裏做出一些很好的邏輯。

我們將增加的消息並等待一段時間,你可以把它Random時間,e.g:

sendMessageButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 

        chatMessages.add(newMessage); 
        adapter.notifyDataSetChanged(); 

       } 
      },random); 

     } 
    }); 
+0

這不是一個消息,它是一個消息數組,它是像谷歌助理,用戶有選擇,如果他選擇其中一個選擇發送到一個方法來確定合適的響應並返回消息列表。如果用戶有一個像「下一個」的按鈕,那麼你的解決方案就可以,所以我們可以管理按鈕點擊延遲 –

+0

@KhaledAbdElnaser,那麼你必須提供給我們,你在代碼中如何使用displayNewMessage。 – Ibrahim