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();