对于RecyclerView的用法就不再累赘,今天主要是讲一下仿小米自带便签里的宫格和列表的切换模式
对于模式的切换,我想大家都有个了解
瀑布流采用的是
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的界面跳转
}
});
}
});
}
这样就完成了一个仿小米便签切换布局模式
对这个编辑器不够了解,代码间距可能有点问题,但问题不大,主要是思路
有错误请各位大佬指教