Android java.lang.IndexOutOfBoundsException:检测到不一致。视图保持架适配器位置ViewHolder无效
这个问题问了很多次,但我不能完全理解, 在这里,我使用Sqlite数据库进行简单的聊天,它的所有原始数据都使用recyclerview填充。 我该怎么办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
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)