2016-02-29 46 views
0

我想刷新我的ListView當有新郵件到達,但我似乎無法得到列表視圖/適配器刷新一次已添加的消息。 NotifyDataSetChangers()似乎不起作用。任何幫助,將不勝感激。ListView控件不刷新自定義適配器

MessagingActivity

public class MessagingActivity extends AppCompatActivity implements AdapterView.OnItemClickListener{ 
    UserCredentialHandler userCredentialHandler; 
    ListView chatListView; 

    List<ChatRowItem> chatRowItems; 
    List<Message> messagesList; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_messaging); 
     userCredentialHandler = new UserCredentialHandler(); 
     Button bMsgJas = (Button)findViewById(R.id.bJas); 
     Button bMsgTest = (Button)findViewById(R.id.bTest); 
     Button bSendMsg = (Button)findViewById(R.id.button_send_message); 
     final EditText inputText = (EditText)findViewById(R.id.chat_enter_message); 

     final String userH = "[email protected]"; 
     final String userT = "[email protected]"; 

     chatRowItems = new ArrayList<>(); 
     final ChatCustomAdapter adapter = new ChatCustomAdapter(this, chatRowItems); 
     chatListView = (ListView)findViewById(R.id.chat_listview); 
     chatListView.setAdapter(adapter); 
     chatListView.setOnItemClickListener(this); 


     bMsgJas.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       SendBird.startMessaging(userH); 
      } 
     }); 

     bMsgTest.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       SendBird.startMessaging(userT); 
      } 
     }); 

     bSendMsg.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       String newMsg = inputText.getText().toString(); 
       SendBird.send(newMsg); 
      } 
     }); 

     SendBird.setEventHandler(new SendBirdEventHandler() { 
      @Override 
      public void onConnect(Channel channel) { 

      } 

      @Override 
      public void onError(int i) { 

      } 

      @Override 
      public void onChannelLeft(Channel channel) { 

      } 

      @Override 
      public void onMessageReceived(Message message) { 
       messagesList.add(message); 

       adapter.updateChatList(chatRowItems); 
      } 

      @Override 
      public void onSystemMessageReceived(SystemMessage systemMessage) { 

      } 

      @Override 
      public void onBroadcastMessageReceived(BroadcastMessage broadcastMessage) { 

      } 

      @Override 
      public void onFileReceived(FileLink fileLink) { 

      } 

      @Override 
      public void onReadReceived(ReadStatus readStatus) { 

      } 

      @Override 
      public void onTypeStartReceived(TypeStatus typeStatus) { 

      } 

      @Override 
      public void onTypeEndReceived(TypeStatus typeStatus) { 

      } 

      @Override 
      public void onAllDataReceived(SendBird.SendBirdDataType sendBirdDataType, int i) { 

      } 

      @Override 
      public void onMessageDelivery(boolean b, String s, String s1, String s2) { 

      } 

      @Override 
      public void onMessagingStarted(final MessagingChannel messagingChannel) { 

       SendBird.queryMessageList(messagingChannel.getUrl()).load(Long.MAX_VALUE, 30, 10, new MessageListQuery.MessageListQueryResult() { 
        @Override 
        public void onResult(List<MessageModel> messageModels) { 
         messagesList = (List<Message>)(List<?>) messageModels; 
         for(int i = 0; i < messageModels.size(); i++){ 
          drawListRows(messagesList.get(i)); 
         } 
         SendBird.join(messagingChannel.getUrl()); 
         SendBird.connect(); 
        } 

        @Override 
        public void onError(Exception e) { 

        } 
       }); 
      } 

      @Override 
      public void onMessagingUpdated(MessagingChannel messagingChannel) { 
      } 

      @Override 
      public void onMessagingEnded(MessagingChannel messagingChannel) { 

      } 

      @Override 
      public void onAllMessagingEnded() { 

      } 

      @Override 
      public void onMessagingHidden(MessagingChannel messagingChannel) { 

      } 

      @Override 
      public void onAllMessagingHidden() { 

      } 
     }); 


    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
          long id) { 
     //final String member_list_id = rowItems.get(position).bookListId; 

    } 

    public void drawListRows(Message msg){ 
     ChatRowItem item = new ChatRowItem(msg.getSenderName(), msg.getMessage(), msg.getTimestamp()); 
     chatRowItems.add(item); 
    } 

    // public void updateChatList(List<ChatRowItem> chatItems){ 
    //  messagesList.clear(); 
    //  messagesList.addAll(newMsgList); 
    } 

ChatCustomAdapter

public class ChatCustomAdapter extends BaseAdapter { 
    List<ChatRowItem> chatRowItemList; 
    Context context; 

    ChatCustomAdapter(Context context, List<ChatRowItem> chatRowItemList){ 
     this.chatRowItemList = chatRowItemList; 
     this.context = context; 
    } 

    @Override 
    public int getCount(){ 
     return chatRowItemList.size(); 
    } 

    @Override 
    public Object getItem(int position){ 
     return chatRowItemList.get(position); 
    } 

    @Override 
    public long getItemId(int position){ 
     return chatRowItemList.indexOf(getItem(position)); 
    } 

    private class ViewHolder { 
     TextView username; 
     TextView message; 
     TextView timestamp; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent){ 
     ViewHolder holder = null; 
     LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 

     if(convertView == null) { 
      convertView = mInflater.inflate(R.layout.chat_msg_item, null); 
      holder = new ViewHolder(); 
      holder.message = (TextView)convertView.findViewById(R.id.chat_message_text); 
      holder.username = (TextView)convertView.findViewById(R.id.chat_user_id); 
      holder.timestamp = (TextView)convertView.findViewById(R.id.chat_timestamp); 

      ChatRowItem row_pos = chatRowItemList.get(position); 

      holder.message.setText(row_pos.message); 
      holder.username.setText(row_pos.userId); 
//   holder.timestamp.setText((int)row_pos.timestamp); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder)convertView.getTag(); 
     } 

     return convertView; 
    } 

    public void updateChatList(List<ChatRowItem> chatItems){ 
     chatRowItemList.clear(); 
     chatItems.addAll(chatItems); 
     this.notifyDataSetChanged(); 
    } 


} 

回答

2
chatItems.addAll(chatItems); 

應該

chatRowItemList.addAll(chatItems); 

但這還不夠。 chatRowItemList.clear();將從chatRowItems中刪除所有項目,因爲您將它作爲參考傳遞給適配器的構造函數。

+0

作出chatRowItemList更正,列表似乎被清除,但當它更新列表是空的。我沒有看到修改chatItems構造函數有多清楚。 'chatRowItemList.clear()''chatRowItemList'和'chatItems'都爲空後的 –

+0

。 – Blackbelt

+0

chatRowItemList.addAll(chatItems)沒有添加新的列表嗎? –

0

我認爲再次設置適配器可以解決

+0

不起作用= [ –

+0

是不是因爲您的適配器是空的?我的意思是,首先也許你必須添加項目到ArrayList,然後實例化適配器,並最終將其設置爲listView,如:chatRowItems = new ArrayList <>(); chatRowItems.add( 「一些」); chatRowItems.add( 「一些」); final ChatCustomAdapter adapter = new ChatCustomAdapter(this,chatRowItems); chatListView.setAdapter(adapter); – Jorgeley