相关疑难解决方法(0)

如何在Android中运行时更改当前主题

我创建了一个PreferenceActivity,允许用户选择他想要应用于整个应用程序的主题.

当用户选择主题时,执行以下代码:

if (...) {
    getApplication().setTheme(R.style.BlackTheme);
} else {
    getApplication().setTheme(R.style.LightTheme);
}
Run Code Online (Sandbox Code Playgroud)

但是,即使我已经使用调试器检查了代码是否正在执行,我也看不到用户界面的任何变化.

主题是定义的res/values/styles.xml,Eclipse没有显示任何错误.

<resources>
    <style name="LightTheme" parent="@android:style/Theme.Light">
    </style>

    <style name="BlackTheme" parent="@android:style/Theme.Black">
    </style>    
</resources>
Run Code Online (Sandbox Code Playgroud)

关于可能发生的事情以及如何解决问题的任何想法?我应该拨打setTheme代码中的任何特殊点吗?如果有帮助,我的应用程序包含几个活动.

android themes

144
推荐指数
7
解决办法
16万
查看次数

强制RecyclerView调用onCreateViewHolder

我有一个recyclerview可以显示项目列表,小网格或大网格,这可以在运行时更改.根据用户选择的样式,我在onCreateViewHolder中扩展不同的布局.

我也RecyclerView用来在样式之间切换.我的代码看起来像这样

layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            if(showType == ProductAdapter.SHOW_TYPE_SMALL_GRID)
                return 1;
            else
                return columnCount; //show one item per row
        }
    });

@Override
public void onClick(View v) {
    if(showType == ProductAdapter.SHOW_TYPE_SMALL_GRID)
        showType = ProductAdapter.SHOW_TYPE_LARGE_GRID;
    else
        showType = ProductAdapter.SHOW_TYPE_SMALL_GRID;


    int firstVisibleItem = layoutManager.findFirstVisibleItemPosition();
    adapter = new ProductAdapter(getActivity(), productList, showType);
    recyclerView.setAdapter(adapter);
    layoutManager.scrollToPosition(firstVisibleItem);
}
Run Code Online (Sandbox Code Playgroud)

问题是强制onCreateViewHolder被调用我每次用户更改样式时都会创建一个新的Object.还有其他办法吗?!强制onBindViewHolder()被召回我只是使用onCreateViewHolder我怎样才能获得类似onCreateViewHolder的东西?

任何不使用多个适配器的解决方案都足够好了!

android android-adapter android-recyclerview

7
推荐指数
1
解决办法
8635
查看次数