【发布时间】:2016-07-10 14:30:11
【问题描述】:
我有 1 个 ArrayList 和 1 个 RecyclerView。从 DB 中检索数据并将其存储在 ArrayList 中,以便在 RecyclerView 中显示。将新项目添加到 RecyclerView 时,所有事情都可以正常工作,但没有添加动画。我知道我应该使用 notifyItemInserted 来添加动画,但它没有用。没有出现插入动画。现在我必须返回上一页,然后再次进入该页面,以便显示添加的项目。那么,如何添加回插入动画呢?
任何帮助将不胜感激。谢谢。
传递数据和设置适配器的代码:
db = new DatabaseHelper(this);
dbList = new ArrayList<>();
dbList = db.getFilteredItems();
RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
mRecyclerView.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
//newest to oldest order (database stores from oldest to newest)
llm.setReverseLayout(true);
llm.setStackFromEnd(true);
mRecyclerView.setLayoutManager(llm);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
adapter = new RecyclerAdapter(this, llm, dbList);
mRecyclerView.setAdapter(adapter);
从数据库中检索数据的代码:
//retrieve filtered data from DB
public List<AudioItem> getFilteredItems(){
List<AudioItem> audioList = new ArrayList<>();
String titleName = EditActivity.titleName;
String query = "select * from " + TABLE_NAME + " where " + COLUMN_NAME_RECORDING_NAME + " like '" + titleName + "%'";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query,null);
if (cursor.moveToFirst()){
do {
AudioItem audio = new AudioItem();
audio.setId(Integer.parseInt(cursor.getString(0)));
audio.setName(cursor.getString(1));
audio.setFilePath(cursor.getString(2));
audio.setLength(Integer.parseInt(cursor.getString(3)));
audio.setTime(Long.parseLong(cursor.getString(4)));
audioList.add(audio);
}while (cursor.moveToNext());
cursor.close();
}
return audioList;
}
将数据插入数据库的代码:
/* Insert data into database */
public void addRecording(String recordingName, String filePath, long length) {
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COLUMN_NAME_RECORDING_NAME, recordingName);
cv.put(COLUMN_NAME_RECORDING_FILE_PATH, filePath);
cv.put(COLUMN_NAME_RECORDING_LENGTH, length);
cv.put(COLUMN_NAME_TIME_ADDED, System.currentTimeMillis());
db.insert(TABLE_NAME, null, cv);
db.close();
if (mOnDatabaseChangedListener != null) {
mOnDatabaseChangedListener.onNewDatabaseEntryAdded();
}
}
调用插入动画的代码:
@Override
public void onNewDatabaseEntryAdded() {
//item added to top of the list
Log.e("Count: ", Integer.toString(getItemCount()));
// notifyDataSetChanged();
notifyItemInserted(getItemCount());
//llm.scrollToPosition(getItemCount() - 1);
}
【问题讨论】:
-
一些代码可以帮助我们帮助您。
-
@nukeforum 代码 sn-ps 添加。谢谢
-
@KenWong,为什么你使用 2 个 arraylist,当你也可以使用单个 arraylist 时,你可以在 getDataFromDB 方法中将 titleName 作为参数传递,然后通过执行类似查询,你可以获取数据并返回它
-
@Vickyexpert 哦,那是我的错误。我现在做了一个ArrayList,但是还是没有RecyclerView的插入动画
-
更新您的上述代码,以便检查确切的问题并帮助您解决它'
标签: java android arraylist android-recyclerview notifydatasetchanged