我有一个包含下一个按钮和上一个按钮的通知。现在当我按下通知中的任何按钮时,广播接收器接收到动作。
我的问题是,当按下任一按钮时,我无法刷新我的recyclerview。
如果我在主类中将我的适配器设置为静态并在广播接收器中调用它,我能够这样做:
BroadCast接收器类:
public void getPlaylistItems(){
if (list != null){
list.clear();
}
SongsDatabase SongsDB = new SongsDatabase(contexts);
Cursor data = SongsDB .getSongs();
if(data.getCount() != 0){
data.moveToFirst();
do{
Songs myList = new (data.getString(0), data.getString(1), data.getString(2), data.getString(3), data.getString(4));
list.add(myList);
} while (data.moveToNext());
}
data.close();
VideoDB.close();
adapter.notifyDataSetChanged <--- This was made static in my Main Activity which contains the recyclerview
}
此解决方案的问题在于它导致我的应用程序内存泄漏。
现在问题是如何在不使任何变量静态的情况下刷新我的recyclerview?
答案 0 :(得分:0)
答案 1 :(得分:0)
是的,您可以在没有RecyclerView
适配器的静态引用的情况下使用。你有ContentObserver
。
我可以看到,您从本地数据库中获取歌曲和视频,您可以轻松地将内容观察者与数据库表一起放入。在这种情况下,您需要先创建Uri
,这可能看起来像这样。
public static final Uri DB_TABLE_SONGS_URI = Uri
.parse("sqlite://" + Constants.ApplicationPackage + "/" + DB_TABLE_SONGS);
// DB_TABLE_SONGS refers to the database table that you have for storing songs.
现在,在歌曲表中更新或插入新行时,您需要像这样通知内容观察者。
context.getContentResolver().notifyChange(DBConstants.DB_TABLE_SONGS_URI, null);
现在使用LoaderCallbacks
和LoaderManager
从歌曲表中获取数据。因此,在onCreateLoader
函数中,您需要注册内容观察器,这将有助于回收您的RecyclerView
,而无需对其进行任何静态引用。
这是一个示例onCreateLoader
函数。
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new SQLiteCursorLoader(getActivity()) {
@Override
public Cursor loadInBackground() {
SongsDatabase SongsDB = new SongsDatabase(contexts);
cursor = SongsDB.getSongs();
this.registerContentObserver(cursor, DBConstants.DB_TABLE_SONGS_URI);
}
return cursor;
}
};
}
不要忘记在onDestroy
函数中销毁加载器实例。
getLoaderManager().destroyLoader(SONGS_QUERY_LOADER);