2016-06-16 2 views
1

Добавленные элементы recyclerView не отображаются до тех пор, пока пользователь не прокрутит список. Я использую websockets для связи. Когда пользователь на сервере отправляет сообщение, сервер возвращает json, который я разбираю для модели, и добавляю его в адаптер recycliewiew. Элемент добавляется в recyclerview, но он не отображается, пока я не прокручу recyclerview вверх или вниз. Я сделал тест, где я добавил статическую строку с тестом Json, и когда я нажимаю на кнопку, он запускает тот же метод, но с тестовыми данными за пределами websocket, и он добавляет элемент поверх recyclerview.RecyclerView: добавленные элементы, не показывающие

Добавлены элементы с помощью этого метода не не отображаются до пользователя свитка:

WebSocket ws = factory.createSocket("wss://example.com/websocket"); 
ws.addListener(new WebSocketAdapter() { 
      @Override 
      public void onTextMessage(WebSocket websocket, String text) throws Exception { 
       adapter.add(parseWs(text); 
      } 
}); 

private Discussion parseWs(String string) { 
    discussion = new JSONObject(string).getJSONObject("data").toString(); 
    Gson gson = new Gson(); 
    return gson.fromJson(discussion, Discussion.class); 
} 

////////////Adapter class//////////// 
public void add(Discussion disc) { 
    list.add(0,disc); 
    notifyItemInserted(0); 
} 

Если я добавить элемент из нажав на кнопку, элементы показываются нормально без прокрутки:

fab.setOnClickListener(v -> 
    adapter.add(parseWs(test)); 
    mRecyclerView.scrollToPosition(0); 
); 

Я m, используя java-библиотеку nv-weboskcet-client.

ответ

0

Не уверен, что вы exactlty хотите, но попробуйте использовать

notifyDataSetChanged(); 

Пусть это будет исправить вашу проблему.

Если вызов асинхронный, вам необходимо использовать класс Handler, чтобы обновить представление.

Android и JavaRx:

https://mttkay.github.io/blog/2013/08/25/functional-reactive-programming-on-android-with-rxjava/

Но попробуйте его с классом Handler.

Handler handler = new Handler(); 
ws.addListener(new WebSocketAdapter() { 
    @Override 
    public void onTextMessage(WebSocket websocket, String text) throws Exception { 
     handler.post(new Runnable(){ 
      adapter.add(parseWs(text); 
     }); 
    } 
}); 

Нечто подобное должно работать :)

Может вы должны объявить Обработчик обработчик как поле в вашей деятельности.

+0

Этот метод разбивает анимацию, и я уведомил адаптер, что я добавил элемент, вы можете увидеть его в коде – mayyo

+0

Вы пробовали его с классом Handler для обновления вашего представления? Потому что кажется, что WebSocket обрабатывает сообщения в другом потоке. – Monarchis

+0

Похоже, вы правы, websocket создает отдельный поток из пользовательского интерфейса, поэтому я попытаюсь использовать Handler для обновления интерфейса. Есть ли возможность использовать метод синхронного подключения с RxJava? – mayyo

Смежные вопросы