2015-07-30 9 views
6

Buduję aplikację na Androida na Javę i używam pliku realm.io dla mojej bazy danych. Mój problem polega na tym, że mam RealmList, a mój niestandardowy adapter ListView akceptuje tylko RealmResults. Poniżej znajduje się kod i więcej szczegółów.Jak zmienić RealmList w RealmResult?

Mam klasę czatu, która ma RealmList, RealmList, userId i chatId.

public class Chat extends RealmObject{ 

private RealmList<Friend> participants; 
private RealmList<Message> messages; 

@PrimaryKey 
private String chatId; 
private String userId; 

... 
} 

W mojej działalności, w których staram się wyświetlać wszystkie wiadomości, że chat, mogę zadzwonić chat.getMessages(), aby uzyskać wszystkie wiadomości na ten czat jako RealmList ale poniżej mój adapter ListView trwa RealmResult ponieważ rozciąga RealmBaseAdapter

public class MessageAdapter extends RealmBaseAdapter<Message> implements ListAdapter { 

private String TAG = getClass().getSimpleName(); 

public MessageAdapter(Context context, 
        RealmResults<Message> realmResults, 
        boolean automaticUpdate) { 
    super(context, realmResults, automaticUpdate); 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) 
    { 
     convertView = inflater.inflate(R.layout.listitem_message, parent, false); 
    } 

    Message message = getRealmResults().get(position); 

    if (message != null) 
    { 
     ((TextView) convertView.findViewById(R.id.message_content)).setText(message.getContent()); 
     DateFormat dateFormat = new SimpleDateFormat("HH:mm", Locale.CANADA); 
     ((TextView) convertView.findViewById(R.id.message_time)).setText(dateFormat.format(message.getTimestamp())); 
    } 

    return convertView; 
} 

public RealmResults<Message> getRealmResults() { 
    return realmResults; 
} 
} 

Oto gdzie ja nazywam to wszystko

RealmList<Message> messages = chat.getMessages(); 

    ListView messageList = (ListView) findViewById(R.id.message_list); 
    adapter = new MessageAdapter(this, messages, true); 
    messageList.setAdapter(adapter); 

Jestem otwarty na zmianę mojego RealmList do RealmResult jeśli to możliwe (mam wyglądał nd wydaje się, że tak nie jest) lub jeśli mogę użyć RealmList w adapterze niestandardowej dziedziny, to byłoby inne rozwiązanie. Wszystko, co pomoże mi przejść do przodu, byłoby wielką pomocą.

dzięki

Odpowiedz

12

Wystarczy zrobić

chat.getMessages().where().findAll() 

(Odpowiedź z here)

1

RealmBaseAdapter ma bardzo prosty implementation.

Tak więc w przypadku, można przekazać konkretne Chat wam kartę, a przeciążenie poniżej metod:

@Override 
public int getCount() { 
    if (realmResults == null || realmResults.size() == 0) { 
     return 0; 
    } 
    return realmResults.first().getMessages().size(); 
} 

@Override 
public T getItem(int i) { 
    if (realmResults == null || realmResults.size() == 0) { 
     return null; 
    } 
    return realmResults.first().getMessages().get(i); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
// You message view here 
} 
+0

Spowoduje to , czy zarządza automatyczną aktualizacją dla obiektu w relacji? – BlackRabbit

+0

Tak, robi. Kiedy zmienia się obiekt w relacji, wywoływane jest również changeListener. Zostanie wywołane 'RealmBaseAdapter.notifyDataSetChanged'. – beeender

+0

co oznacza "T"? ponieważ dostaję niekompatybilny błąd typu zwrotu – Hunt