【问题标题】:How to change a RealmList to RealmResult?如何将 RealmList 更改为 RealmResult?
【发布时间】:2015-07-30 21:08:50
【问题描述】:

我正在构建一个 Java android 应用程序,并且我正在使用 realm.io 作为我的数据库。我的问题是我有一个 RealmList,而我的自定义 ListView 适配器只接受 RealmResults。下面是代码和更多细节。

我有一个 Chat 类,它有一个 RealmList、RealmList、userId 和一个 chatId。

public class Chat extends RealmObject{

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

@PrimaryKey
private String chatId;
private String userId;

...
}

在我尝试显示聊天的所有消息的活动中,我可以调用 chat.getMessages() 以获取此聊天的所有消息作为 RealmList 但我下面的 ListView 适配器采用 RealmResult 因为它扩展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;
}
}

这就是我所说的一切

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

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

如果可能的话,我愿意将我的 RealmList 更改为 RealmResult(我已经查看过,但似乎不是),或者如果我可以在自定义领域适配器中使用 RealmList,这将是另一种解决方案。任何能帮助我前进的事情都会有很大的帮助。

谢谢

【问题讨论】:

    标签: java android realm


    【解决方案1】:

    做吧

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

    (来自here的回答)

    【讨论】:

      【解决方案2】:

      RealmBaseAdapter 有一个很简单的implementation

      因此,在这种情况下,您可以将特定的Chat 传递给您的适配器,并重载以下方法:

      @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
      }
      

      【讨论】:

      • 这样做,它是否管理相关对象的自动更新?
      • 是的,确实如此。当相关对象发生变化时,changeListener 也会被触发。并且RealmBaseAdapter.notifyDataSetChanged 将被调用。
      • T 代表什么?因为我收到不兼容的返回类型错误
      • 好的,我面临的问题是我的适配器类是public class CompensationProductAdapter extends RealmBaseAdapter&lt;CompensationList&gt; ,当我使用@Override public CompensationProductsList getItem(int i) { if (compensationList == null || compensationList.size() == 0) { return null; } return compensationList.first().getCompensationProductsLists().get(i); } 覆盖getItem 时,我遇到了不兼容的错误
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多