Android java.lang.IndexOutOfBoundsException:检测到不一致。视图保持架适配器位置ViewHolder无效

Android java.lang.IndexOutOfBoundsException:检测到不一致。视图保持架适配器位置ViewHolder无效,java,android,android-recyclerview,android-adapter,Java,Android,Android Recyclerview,Android Adapter,这个问题问了很多次,但我不能完全理解, 在这里,我使用Sqlite数据库进行简单的聊天,它的所有原始数据都使用recyclerview填充。 我该怎么办 创建类MyDbHandler扩展SQLiteOpenHelper 创建返回列表的方法 在活动类中创建适配器类的实例,并在适配器中传递列表 公共类MyDbHandler扩展了SQLiteOpenHelper{ public List<SqlMessages> sqlMessagesList() { String query

这个问题问了很多次,但我不能完全理解, 在这里,我使用Sqlite数据库进行简单的聊天,它的所有原始数据都使用recyclerview填充。 我该怎么办

  • 创建类MyDbHandler扩展SQLiteOpenHelper
  • 创建返回列表的方法
  • 在活动类中创建适配器类的实例,并在适配器中传递列表

    公共类MyDbHandler扩展了SQLiteOpenHelper{

    public List<SqlMessages> sqlMessagesList()
      {
      String  query = "SELECT  * FROM " + TABLE_NAME;
        List<SqlMessages> messagesList=new LinkedList<>();
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);
        SqlMessages sqlMessages;
            if (cursor.moveToFirst()) {
                do {
                sqlMessages.setId(cursor.getLong(cursor.getColumnIndex(COLUMN_ID)));
                sqlMessages.setFromid(cursor.getString(cursor.getColumnIndex(COLUMN_FROM)));
                sqlMessages.setType(cursor.getString(cursor.getColumnIndex(COLUMN_TYPE)));
                sqlMessages.setMessage(cursor.getString(cursor.getColumnIndex(COLUMN_MESSAGE)));
                sqlMessages.setTimestamp(cursor.getLong(cursor.getColumnIndex(COLUMN_TIMESTAMP)));
    
                messagesList.add(sqlMessages);
            } while (cursor.moveToNext());
        }
        return messagesList;
    }
    
    当添加新消息时

    final SQLiteDatabase db= myDbHandler.getWritableDatabase();
    
            ContentValues values = new ContentValues();
    
            values.put(COLUMN_MESSAGE, messageText);
            values.put(COLUMN_FROM, MessageSenderId);
            values.put(COLUMN_TYPE, TYPE_TEXT);
            values.put(COLUMN_TIMESTAMP,tsLong);
    
    
            long rowInserted = db.insert(TABLE_NAME,null, values);
            if(rowInserted != -1)
            {
                Log.v("sqlitesave","ok");
                messagesAdapter.notifyItemInserted(myDbHandler.sqlMessagesList().size()-1);
                // to use of notifyItemInserted the app is crash(not every time but sometime) Logcat show below error
            }
             else
            {
                Log.v("sqlitesave","notok");
            }
            db.close();
    
    LogCat

    java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{6cea9b9 position=15 id=-1, oldPos=14, pLpos:14 scrap [attachedScrap] tmpDetached no parent} android.support.v7.widget.RecyclerView{4aedc2 VFED..C.. ......I. 0,108-720,723 #7f080217 app:id/message_list_user}, adapter:".......".chat.MessagesAdapter@1cd2f63, layout:android.support.v7.widget.LinearLayoutManager@25f8760, context:"........".chat.MessageActivity@cd7aab8
            at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5715)
            at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5898)
    
    我试过了 messagesAdapter.notifyDataSetChanged(); 它工作得非常完美,所有开发人员回答的这类问题都是使用
    notifyDataSetChanged
    ,但对于进一步的操作,我需要使用
    notifyitemserted

    那么如何正确使用notifyItemInserted来处理此异常?

    错误可能来自您的消息Adapter,您需要在此处提供其代码。您好,Vora。您找到问题的答案了吗?您能否确认此崩溃仅发生在samsungs上,就像这里一样错误可能来自您的消息sAdapter,你需要在这里提供它的代码。嗨,Vora。你找到你问题的答案了吗?你能确认这次碰撞只发生在像这里这样的三星上吗
    java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{6cea9b9 position=15 id=-1, oldPos=14, pLpos:14 scrap [attachedScrap] tmpDetached no parent} android.support.v7.widget.RecyclerView{4aedc2 VFED..C.. ......I. 0,108-720,723 #7f080217 app:id/message_list_user}, adapter:".......".chat.MessagesAdapter@1cd2f63, layout:android.support.v7.widget.LinearLayoutManager@25f8760, context:"........".chat.MessageActivity@cd7aab8
            at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5715)
            at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5898)