从广播接收器刷新Recyclerview

时间:2018-02-10 14:19:55

标签: android android-recyclerview recycler-adapter

我有一个包含下一个按钮和上一个按钮的通知。现在当我按下通知中的任何按钮时,广播接收器接收到动作。

我的问题是,当按下任一按钮时,我无法刷新我的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?

2 个答案:

答案 0 :(得分:0)

我相信你在activity / fragment中创建了一个内部类。为避免使适配器静止,您可以在onCreate函数内部创建此广播接收器。 其他方法可能是使用Event Bus,接口或RxJava

答案 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);

现在使用LoaderCallbacksLoaderManager从歌曲表中获取数据。因此,在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);