2016-03-22 2 views
4

В настоящее время я показываю список элементов для увеличения и понижения для пользователей на основе количества, которое им нравится.Обновление Android GCM/Listview

Скажем, например, есть 3 разных предмета, Задача 1, Задача 2, Задача 3, каждая из которых имеет 0 голосов. Когда я выдвигаюсь на один предмет, я бы хотел, чтобы он переходил над другим, и если я понижаю его, то он идет ниже другого. Я получил это, чтобы отлично работать через адаптер списка и пользовательский класс, который расширяет BaseAdapter, единственная проблема, с которой я сталкиваюсь сейчас, заключается в том, что если я нахожусь на своем собственном клиенте, и я перевешиваю элемент, в то время как другой пользователь также выполняет поиск элемента, он обновит мой список, и он не покажет, что локальный пользователь больше нажал на элемент, чтобы они могли голосовать неограниченное количество раз.

В настоящее время у меня есть 2 Arraylists, один со всеми элементами и один с только теми предметами, которые были нажаты, и были ли они сохранены или опущены. Я подумал, что возможно, вызов .notifyDataSetChanged() устранит проблему, но в настоящее время она просто не работает.

В настоящее время я использую GCM, чтобы отправить хост-пользователю сообщение о том, что они были upvote или downvote, основной хост upvotes/downvotes элемент и отправляет новый список всем другим клиентам.

Если вам нужен какой-либо код, чтобы просто спросить, спасибо за помощь.

+1

Почему вы отправляете новый список? Возможно, если бы вы отправили только измененную запись (идентифицированную некоторым UID) и ее действие (вверх/вниз), вы могли бы выполнять обновление локально всякий раз, когда сообщение получено вместо того, чтобы переопределять существующий список с принятым номером –

+0

@Lablabla, о котором я думал об этом, но как бы я удостоверился, что хост и пользователь видят тот же список. – Rockyfish

+0

Это зависит от того, как вы убедитесь, что это произошло прямо сейчас? Как называется «Задача» изначально?если они являются локальными и новыми, когда они создаются, отправляются другим лицам и «появляются», вы можете подумать о сервере (у вас, вероятно, есть один для GCM), для синхронизации –

ответ

1

Вы можете отправить только соответствующую запись и действие на нее и разрешить принимающей стороне обновлять свою собственную базу данных.

Я думаю, что правильный способ сделать это - создать объект для каждой задачи. Каждый со своим собственным UID (я использовал номер в примере, но он должен быть уникальным, так что, может быть, другой способ лучше).

Затем у вас есть несколько операций над этим объектом, которые происходят локально и должны быть отправлены на сервер, например.

  • Добавить новую задачу будет отправлять на сервер

    { "data": { 
        "uid": "1", 
        "operation": "new" 
        "task": "task1String" 
    } 
    

    и принимающей стороны можно было бы добавить это к своей собственной базе данных

  • вверх/вниз голосования задача будет отправить на сервер

    { "data": { 
        "uid": "1", 
        "operation": "upvote"/"downvote" 
    } 
    

    и таким образом принимающая сторона будет знать, чтобы изменить голос та ск идентифицируется UID 1

  • ...

Надеется, что это помогает.

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