我在片段中定义了一个SharedPreferences
变量,该变量用于RecyclerView的适配器类。加载RecyclerView时,在MemeViewHolder
类中检查一个条件:
private static final String REWARD_GRANTED_KEY = "reward_granted_nsfw";
if (mSharedPrefs.getBoolean(REWARD_GRANTED_KEY, false)) {
adBtn.setVisibility(View.GONE);
adSpace.setVisibility(View.VISIBLE);
} else {
adBtn.setVisibility(View.VISIBLE);
adSpace.setVisibility(View.GONE);
}
我面临的问题是这个片段是列表中的第二个片段。第一个片段也包含相同的代码(但其本身的密钥不同)。但是,第一个片段中的条件会立即执行,因为它是在启动时加载的。第二个片段出现了问题,因为直到我导航到该片段时才调用适配器类。结果,不执行上述代码块。因此,当我切换到第二个片段时,我最初看到adBtn
可见性设置为VISIBLE
。只有在滚动一点之后,条件才最终被执行,可见性根据SharedPreferences
中的值更新。
我想知道是否有一个解决方案可以从这个片段(REWARD_GRANTED_KEY
)中检索共享的首选项,并在第一个片段或主Activity中使用它。通过这个更改,我可以从Activity的Angular 修改片段的条件:
if (mSharedPrefs.getBoolean(REWARD_GRANTED_KEY, false)) {
adBtn.setVisibility(View.GONE);
adSpace.setVisibility(View.VISIBLE);
} else {
adBtn.setVisibility(View.VISIBLE);
adSpace.setVisibility(View.GONE);
}
此外,即使我从第一个片段或主Activity获得共享偏好,我如何修改第二个片段的视图而不首先实际加载第二个片段?
你能为这种情况提出一个解决方案吗?
1条答案
按热度按时间cunj1qz11#
一种方法可以是使用notifyDataSetChanged()通知fragment的onResume()方法中的回收器视图-请参见这里。
类似但稍微好一点的方法是使用这个listener监听SharedPreferences的更改。
最好的方法是转移到例如共享视图模型,这将需要对您的方法进行整体返工。