package com.cc.test;
import android.graphics.Color;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.cc.test.adapter.LeftAdapter;
import com.cc.test.adapter.RightAdapter;
import com.cc.test.listener.RightItemCheckListener;
import com.cc.test.model.RightBean;
import com.cc.test.model.SortBean;
import com.cc.test.view.ItemHeaderDecoration;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* 主界面
* 14点57分
*
* @author cc
*/
public class MainActivity extends AppCompatActivity implements RightItemCheckListener {
//左边的rv列表和适配器
private RecyclerView mRvLeft;
private LeftAdapter leftAdapter;
private LinearLayoutManager mLinearLayoutManager;
//右边的rv列表和适配器
private RecyclerView mRvRight;
private RightAdapter rightAdapter;
private GridLayoutManager mManager;
//总数据源
private List<SortBean> mSortBean = new ArrayList<>();
//右边的数据源
private List<RightBean> rightBeanList = new ArrayList<>();
//头部吸附自定义分割线
private ItemHeaderDecoration mDecoration;
private boolean move = false;
//标量
private int mIndex = 0;
//点击左边某一个具体的item的位置
private int targetPosition;
//是否可移动
private boolean isMoved;
/**
* 开始
*
* @param savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//加载默认数据
getDefaultData();
//初始化控件
initLeftView();
initRightView();
}
/**
* 获取默认数据
*/
private void getDefaultData() {
//获取asset目录下的资源文件
String assetsData = getAssetsData("data.json");
Gson gson = new Gson();
//mSortBean就是要使用的集合啦
mSortBean = gson.fromJson(assetsData, new TypeToken<List<SortBean>>() {
}.getType());
}
/**
* 初始化左边的rv及绑定适配器
*/
private void initLeftView() {
mRvLeft = (RecyclerView) findViewById(R.id.rv_left);
mLinearLayoutManager = new LinearLayoutManager(this);
mRvLeft.setLayoutManager(mLinearLayoutManager);
DividerItemDecoration decoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
mRvLeft.addItemDecoration(decoration);
//左边的item要填充的内容啦
List<String> leftTitle = new ArrayList<>();
//初始化左侧列表数据
for (int i = 0; i < mSortBean.size(); i++) {
leftTitle.add(mSortBean.get(i).getName());
}
//左边的adapter开始实现并处理item的点击事件
leftAdapter = new LeftAdapter(this, leftTitle, (id, position) -> {
//可以移动啦
isMoved = true;
//目标的下标
targetPosition = position;
//去设置
setChecked(position, true);
});
//绑定适配器
mRvLeft.setAdapter(leftAdapter);
}
/**
* 创建右边的布局
*/
private void initRightView() {
//获取右边的控件
mRvRight = (RecyclerView) findViewById(R.id.rv_right);
//监听右边的滑动事件
mRvRight.addOnScrollListener(new RecyclerViewListener());
//创建item布局管理器
mManager = new GridLayoutManager(this, 3);
//通过isTitle的标志来判断是否是头部吸附title
mManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return rightBeanList.get(position).isTitle() ? 3 : 1;
}
});
//设置布局管理
mRvRight.setLayoutManager(mManager);
//点击事件
rightAdapter = new RightAdapter(this, rightBeanList, (id, position) -> {
String content = "";
switch (id) {
case R.id.root:
content = "title";
break;
case R.id.content:
content = "content";
break;
}
Snackbar snackbar = Snackbar.make(mRvRight, "当前点击的是" + content + ":" + rightBeanList.get(position).getName(), Snackbar.LENGTH_SHORT);
View mView = snackbar.getView();
mView.setBackgroundColor(Color.BLUE);
TextView text = mView.findViewById(android.support.design.R.id.snackbar_text);
text.setTextColor(Color.WHITE);
text.setTextSize(25);
snackbar.show();
});
//绑定适配器
mRvRight.setAdapter(rightAdapter);
//创建一个自定义分割线,给右边的列表布局添加上
mDecoration = new ItemHeaderDecoration(this, rightBeanList);
mRvRight.addItemDecoration(mDecoration);
//分割线点击事件
mDecoration.setCheckListener(this);
//循环遍历数据源
for (int i = 0; i < mSortBean.size(); i++) {
//将一级数据添加为头部数据(就左边的列表数据)
RightBean head = new RightBean(mSortBean.get(i).getName());
//头部设置为true
head.setTitle(true);
head.setTitleName(mSortBean.get(i).getName());
//这里的tag不能为空,不能重复,是滑动对比用的
head.setTag(String.valueOf(i));
//添加到右边的数据源集合里面去
rightBeanList.add(head);
//开始遍历二级数据,真正在右边item加载的数据
List<SortBean.CategoryTwoArrayBean> categoryTwoArray = mSortBean.get(i).getCategoryTwoArray();
//遍历
for (int j = 0; j < categoryTwoArray.size(); j++) {
//遍历每一个并添加到右边的数据源里面
RightBean body = new RightBean(categoryTwoArray.get(j).getName());
body.setTag(String.valueOf(i));
String name = mSortBean.get(i).getName();
body.setTitleName(name);
rightBeanList.add(body);
}
}
//刷新
rightAdapter.notifyDataSetChanged();
mDecoration.setData(rightBeanList);
}
/**
* 右边列表的滑动事件
*/
private class RecyclerViewListener extends RecyclerView.OnScrollListener {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (move && newState == RecyclerView.SCROLL_STATE_IDLE) {
move = false;
int n = mIndex - mManager.findFirstVisibleItemPosition();
if (0 <= n && n < mRvRight.getChildCount()) {
int top = mRvRight.getChildAt(n).getTop();
mRvRight.smoothScrollBy(0, top);
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (move) {
move = false;
int n = mIndex - mManager.findFirstVisibleItemPosition();
if (0 <= n && n < mRvRight.getChildCount()) {
int top = mRvRight.getChildAt(n).getTop()
谁抢我的小口口
- 粉丝: 4175
- 资源: 41
最新资源
- (177960646)基于SpringBoot的网上订餐系统
- (178844814)基于springboot创建的web项目
- (179486640)CNN-LSTM多变量回归预测(Matlab) 基于卷积-长短期记忆网络(CNN-LSTM)的数据回归预测 1.CNN结合LST
- java项目,毕业设计-疫苗接种管理系统
- (173451010)springboot学生宿舍管理系统 (源码+数据库)453155
- 泰勒图 Matlab代码 案例详细提供2套泰勒图画法:原始数据的泰勒图与对数据标准化后的泰勒图 笔者对此泰勒图代码进行了详细的注释,可实现点的大小和颜色的自定义设置,提供多种配色,可根据爱好自行设置喜
- (176609592)个人博客系统网页实现(Spring Boot + SpringMVC + MyBatis)
- java项目,毕业设计-应急救援物资管理系统
- (177546228)基于SpringBoot + Vue的外卖点餐系统源码
- 高效1600双轴撕碎机sw16可编辑全套技术资料100%好用.zip
- (178592238)1124905257887411C++图书管理系统.zip
- 此存储库包含模拟电动汽车、热泵和热泵热水器对电网影响的代码
- 三边封制袋机程序 采用松下PLC和威纶通触摸屏 前后双伺服送料 屏幕485通讯控制温度 温控模块常州汇邦 一分钟速度可达200张 中英文切操作系统 在用的设备上拷贝下来的,有触摸屏和PL
- (177534038)数据库课程设计-酒店信息管理系统,使用了PyQt5、Python与MySQL8.0.29,附带实验报告 .zip
- (179069856)Python实现爬虫+辅助案例.zip
- (175921014)c&c++课程设计-图书管理系统.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论5