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

时间:2017-04-26 06:52:04

标签: java android realm

我正在使用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; } 作为我的数据集。

这是适配器代码:

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

以下是我在Activity中为聊天室初始化找到RealmResult的方法:

chatRoomWrapper.message.deleteAllFromRealm();
chatRoomWrapper.message.addAll(api.res.message_item_list);
Appcontroller.realm.copyToRealmOrUpdate(chatRoomWrapper);

初始化后,我进行API调用,结果如下:

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)

我收到了这个错误:

RealmRecyclerViewAdapter

这是否意味着RV的内容意外更改?我正在使用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();

编辑:

这是我从服务器获取信息后更新适配器的方法:

class Test {
  def test() {
    String.format("%s",1)
    String.format("%s","x")
    String.format("%s",3)
    String.format("%s","x")
    String.format("%s",5)
  }
}

1 个答案:

答案 0 :(得分:0)

罪魁祸首是使用position代替holder.getAdapterPosition()来获取该项目。我曾经这样做过:

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

现在是

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

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