2017-04-26 28 views
0

我正在使用RealmRecyclerViewAdapter并正在使用RealmResult作为我的数据集。当从Activity活动更新RealmList时,Android - rowIndex小于0

这里的适配器代码:

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

以下是我找到的聊天室初始化在活动的RealmResult:

AppController.realm.beginTransaction(); 
// Getting chat inside the specific room id 
ChatRoomWrapper chatFriendRealmResult = AppController.realm.where(ChatRoomWrapper.class) 
     .equalTo(ChatRoomWrapperFields.ROOM_ID, roomId).findFirst(); 
if (chatFriendRealmResult != null){ 
    chatRoomAsUserAdapter = new ChatRoomAsUserAdapter(this, chatFriendRealmResult.message); 
    AppController.realm.commitTransaction(); 
} 
... 

初始化之后,我做了一个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哪个应该处理这个权利?

UPDATE:

这里是我如何获取数据的例子:

getItem(position).getMsg_date();

其中

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

什么版本的Realm是这个? – EpicPandaForce

+0

The Fabled @EpicPandaForce!它是领域3.1.2,我喜欢你的名字BTW:D –

+0

有时我觉得我应该在更多的地方使用这个名字,但是唉:我也喜欢它,它很好搜索。 Anyhoo,你可能想要删除'this.mDataset = data;'和'mDataset',并使用'getData()'''updateData()'来代替。 – EpicPandaForce

回答

0

的罪魁祸首的position代替holder.getAdapterPosition()使用情况,以获得该项目。我曾经这样做:

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

现在是

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

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

相关问题