Java Android-从活动更新RealmList时,rowIndex小于0

Java Android-从活动更新RealmList时,rowIndex小于0,java,android,realm,Java,Android,Realm,我正在使用RealmRecyclerViewAdapter并使用RealmResult作为我的数据集 以下是适配器代码: private RealmList<MessageItem> mDataset; public ChatRoomAsUserAdapter(Context context, @Nullable RealmList<MessageItem> data) { super(data, true); this.context = contex

我正在使用
RealmRecyclerViewAdapter
并使用
RealmResult
作为我的数据集

以下是适配器代码:

private RealmList<MessageItem> mDataset;

public ChatRoomAsUserAdapter(Context context, @Nullable RealmList<MessageItem> data) {
    super(data, true);
    this.context = context;
    this.userId = Utilities.getUserInformation(context, SharedPreferencesList.userIDString);
    this.mDataset = data;
}
初始化后,我进行API调用,结果如下:

chatRoomWrapper.message.deleteAllFromRealm();
chatRoomWrapper.message.addAll(api.res.message_item_list);
Appcontroller.realm.copyToRealmOrUpdate(chatRoomWrapper);
我得到了这个错误:

java.lang.ArrayIndexOutOfBoundsException: rowIndex is less than 0.
at io.realm.internal.LinkView.nativeGetTargetRowIndex(Native Method)
at io.realm.internal.LinkView.getTargetRowIndex(LinkView.java:82)
at io.realm.RealmList.get(RealmList.java:452)
这是否意味着RV的内容发生意外变化?我使用的是
RealmRecyclerViewAdapter
哪个应该正确处理这个问题

更新:

以下是我如何获取数据的示例:

getItem(position).getMsg_date()

在哪里

编辑:

以下是从服务器获取信息后更新适配器的方式:

AppController.realm.beginTransaction();
// Create new ChatFriendWrapper and input the Room ID into it to update
// the Room ID if found
ChatRoomWrapper chatRoomWrapper = AppController.realm.where(ChatRoomWrapper.class)
        .equalTo("room_id", roomId).findFirst();
if (chatRoomWrapper != null) {
    if (output.flag.equals(Constants.flagRefresh)) {
        counter = 0;
        chatRoomWrapper.message.deleteAllFromRealm();
        chatRoomWrapper.message.addAll(output.message_item_list);
        MIApplication.realm.copyToRealmOrUpdate(chatRoomWrapper);
        manager.scrollToPosition(0);
    } else if (output.flag.equals(Constants.flagLoad)) {
        chatRoomWrapper.message.addAll(output.message_item_list);
        AppController.realm.copyToRealmOrUpdate(chatRoomWrapper);
    }
} else {
    ChatRoomWrapper newChatRoomWrapper = new ChatRoomWrapper();
    newChatRoomWrapper.room_id = roomId;
    newChatRoomWrapper.message.addAll(output.message_item_list);
    AppController.realm.copyToRealmOrUpdate(newChatRoomWrapper);
    setupChatRoom();
}
AppController.realm.commitTransaction();

罪魁祸首是使用
position
而不是
holder.getAdapterPosition()
获取物品。我曾经这样做过:

viewholder.message.setText(getItem(position.message))

现在是

viewholder.message.setText(getItem(holder.getAdapterPosition()).message)


它消除了错误。我突然想起,当我在
recyclererview
中遇到无限滚动问题时,我也遇到了这种错误。

这是什么版本的领域?传说中的@EpicPandaForce!这是领域3.1.2,我喜欢你的名字顺便说一句:d有时我觉得我应该在更多的地方使用这个名字,但是唉:p我也喜欢它,它很容易搜索。无论如何,您可能要删除
this.mDataset=data
mDataset
一起,使用
getData()
/
updateData()
来代替。@EpicPandaForce哈哈,是的,它是独一无二的,这就是为什么我在某处遇到你的名字后仍然记得它的原因!顺便说一句,我是这个领域的同一个人,问的都是同样的问题,希望SO的一些人也能帮上忙。。嗯,我试过你说的,但它仍然报告相同的错误,还有什么我能做的吗?在这种情况下,我需要堆栈跟踪的下一行,它指定在哪里调用代码中崩溃的
get()
public class MessageItem extends RealmObject {
    ...
    public String msg_date = "";
}
AppController.realm.beginTransaction();
// Create new ChatFriendWrapper and input the Room ID into it to update
// the Room ID if found
ChatRoomWrapper chatRoomWrapper = AppController.realm.where(ChatRoomWrapper.class)
        .equalTo("room_id", roomId).findFirst();
if (chatRoomWrapper != null) {
    if (output.flag.equals(Constants.flagRefresh)) {
        counter = 0;
        chatRoomWrapper.message.deleteAllFromRealm();
        chatRoomWrapper.message.addAll(output.message_item_list);
        MIApplication.realm.copyToRealmOrUpdate(chatRoomWrapper);
        manager.scrollToPosition(0);
    } else if (output.flag.equals(Constants.flagLoad)) {
        chatRoomWrapper.message.addAll(output.message_item_list);
        AppController.realm.copyToRealmOrUpdate(chatRoomWrapper);
    }
} else {
    ChatRoomWrapper newChatRoomWrapper = new ChatRoomWrapper();
    newChatRoomWrapper.room_id = roomId;
    newChatRoomWrapper.message.addAll(output.message_item_list);
    AppController.realm.copyToRealmOrUpdate(newChatRoomWrapper);
    setupChatRoom();
}
AppController.realm.commitTransaction();