RecyclerView的动态切换布局模式(宫格<-->列表)

对于RecyclerView的用法就不再累赘,今天主要是讲一下仿小米自带便签里的宫格和列表的切换模式

给大家看下小米便签的
image

image

对于模式的切换,我想大家都有个了解
瀑布流采用的是

StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);    //两列且垂直方向布局
recyclerView.setLayoutManager(layoutManager);

列表模式采用的是

LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);    //垂直方向布局
recyclerView.setLayoutManager(layoutManager);

对于两种模式的切换,就需要添加一个判断来判定切换哪种模式

private boolean flag =true; //默认的标识

建立一个方法,用于切换的判断

private void changeLayout(boolean isChange) {
        //布局切换方法
        //如果isChange == true 就调用瀑布流模式,反之调用列表模式
        if (isChange) {
            //瀑布流设置
            StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
            layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
            recyclerView.setLayoutManager(layoutManager);
            adapter = new NoteAdapter(noteBeanList, MainActivity.this, R.layout.item_note);
            adapter.notifyItemInserted(0);
            recyclerView.setAdapter(adapter);
        } else {
            //列表模式
            LinearLayoutManager layoutManager = new LinearLayoutManager(this);
            layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
            recyclerView.setLayoutManager(layoutManager);
            adapter = new NoteAdapter(noteBeanList, MainActivity.this, R.layout.item_note);
            adapter.notifyItemInserted(0);
            recyclerView.setAdapter(adapter);
        }
    }

小米便签的切换位置在menu中,其中的标题会随切换更改

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.list_mode:
                if (flag) {
                    if (item.getTitle().equals("列表模式")) {
                        item.setTitle("宫格模式");
                        flag = !flag;
                        changeLayout(flag);
                    } else {
                        item.setTitle("列表模式");
                        flag = !flag;
                        changeLayout(flag);
                    }
                    FindAll(); //切换布局后需要重新加载数据,否则会出现切换后点击数据报空指针异常
                } else {
                    if (item.getTitle().equals("列表模式")) {
                        item.setTitle("宫格模式");
                        flag = !flag;
                        changeLayout(flag);
                    } else {
                        item.setTitle("列表模式");
                        flag = !flag;
                        changeLayout(flag);
                    }
                    FindAll();
                }
                break;
            default:
                break;
        }
        return true;
    }

基本功能就是这样,但是只是这样的话会发现,每次重启应用后都会恢复默认的模式,那么怎么记录下模式,在重启应用后是之前切换的布局呢?
这里就可以采用SharedPreferences存储,在退出应用时把切换的flag表示记录下来,在重启应用时把标识取出来,再初始化模式就好了
在onDestroy重载方法中:

@Override
protected void onDestroy() {
    super.onDestroy();
    SharedPreferences.Editor editor = getSharedPreferences("flag", MODE_PRIVATE).edit();
    editor.putBoolean("flag", flag);
    Log.e("onDestroy", flag + "");
    editor.apply();
}

这样就在应用退出后保存了切换的模式
然后在onCreate重载方法中从SharedPreferences读取保存的标识

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    SharedPreferences prefer = getSharedPreferences("flag", MODE_PRIVATE);
    flag = prefer.getBoolean("flag", true);
    Log.e("onCreate", flag +"");
    FindAll();    //数据加载的方法
}

基本的内容就是这样,有个问题,如果在Intent的Activity中新增了一个数据,返回主界面时,会发现新增的数据没有显示,此时就跟Activity的生命周期有关了,从Intent的Activity返回主界面,首先调用的就是onRestart重载方法,为了让新增的数据显示,需要在此方法中调用加载数据的方法

@Override
protected void onRestart() {
    super.onRestart();
    //数据重载
    FindAll();
}

最后给出FindAll方法的部分内容

private void FindAll() {
        //从LitePal查找所有数据
        noteBeanList.clear();
        LitePal.findAllAsync(NoteBean.class).listen(new FindMultiCallback() {
            @Override
            public void onFinish(List list) {
                noteBeanList = list;
                Log.e("数量", noteBeanList.size() + "");
                //布局模式切换
                changeLayout(flag);
                adapter.setOnItemClickListener(new NoteAdapter.OnItemClickListener() {
                    @Override
                    public void onItemClick(NoteBean note, int position) {
                        ...//item的界面跳转
                    }
                });
            }
        });
    }

这样就完成了一个仿小米便签切换布局模式
对这个编辑器不够了解,代码间距可能有点问题,但问题不大,主要是思路
有错误请各位大佬指教

你可能感兴趣的:(RecyclerView的动态切换布局模式(宫格<-->列表))