1. 主要内容
- MD常见的控件
- CardView使用
- UI结构布局和边距
- AppBar的使用
- 滚动隐藏AppBar 和 Banner
- 滚动加载新闻列表
- 左滑加载NewsContent
2. 常见MD控件
- CoordinatorLayout: 一个加强的FrameLayout,可以监听所有子控件的各种事件(滑动,点击),并做出反应(AppBarLayout隐藏和折叠)
!!!别和注意ConstraintLayout弄混 - ToolBar:代替ActionBar,App 主题要选择NO ActionBar
- AppBarLayout :包裹ToolBar,实现上滑隐藏,必须和CoordinatorLayout一起使用
- CollapsingToolbarLayout :实现标题的折叠,常见的两段式折叠
- DrawerLayout :与Navigation一起组成滑动菜单
- NavigationView :继承了FrameLayout
- RecyclerView: 可以简单实现布局和动画,复用了ConvertView没??
- CardView:可以设置圆角,阴影和背景色,
- AutoScrollViewPager:
- TabLayout:可以镶嵌在Viewpaer中
- TextInputLayout: 登陆,常见输入控件
- FloatingActionButton:...
- Snackbar:代替Toast的控件,可以添加点击事件
- NestedScollView:
2. CardView实现新闻列表
主要属性:背景色,圆角弧度,Z轴高度(阴影)
注意设置margin属性时,列表中两个item的间距是top+bottom
-
编写newslist_item.xml
在adapter的viewholder中实例化CardView控件,onBinderView()中实现点击事件
3. ??? margin 和padding常用标准
4. toolbar上滑隐藏
!!!CoordinatorLayout的滚动事件无法实现,无论是标题栏还是Banner
因为我的toolbar.xml最外面多包裹了一个frameLayout.....
5. 下拉刷新SwipeRefreshLayout
- 将滚动属性behavior放到SwipeRefreshLayout里面;
- 在Activity中实现SwipeRefreshLayout的滑动监听;
- 在事件结束后,调用SwipeRefreshLayout.setRefreshing(false);
- 问题:Banner是直接挡在recyclerview上方。
是因为RecyclerView没放到SwipeRefreshLayout里面。
6. 底部自动加载
- RecyclerView加载Item原理:RecyclerView加载item之前会调用getItemCount方法,然后调用相同次数的onBindeViewHolder方法,显示相同条数的数据。
- 添加PastNewsInfo
原来Info类的内部类拿出来复用。往日新闻包括日期和新闻列表,而今日新闻只多了一个TopStoryList,也就是说二者存在重复的info类。 - ApiService接口获取PastNewsInfo的方法
注意接口中的date为String类型 - list底部监听
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
String date = "20181001";
//item数量
int totalItemCount = recyclerView.getAdapter().getItemCount();
//最后可见的item的position
int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
int visiableItemCount = recyclerView.getChildCount();
if(newState == RecyclerView.SCROLL_STATE_IDLE
&& lastVisibleItemPosition == totalItemCount -1
&& visiableItemCount > 0) {
getPastNews(date);//去掉第一个判断,响应会更快
Toast.makeText(getApplicationContext(),"bottom",Toast.LENGTH_SHORT).show();
}
}
});
- 更新RecyclerView数据:notifyDataSetChanged()
List<StoryBean> pastStories = pastNews.getStories();//新的数据表
stories.addAll(pastStories);//添加到mStoryAdapter绑定的data
mStoryAdapter.notifyDataSetChanged();//更新
7. 添加日期头View
- 自定义view
- 用来记录日期,在底部更新时用到
- adapter中ViewType用法