美文网首页
2.singleLine0的知乎日报学习:Material De

2.singleLine0的知乎日报学习:Material De

作者: singleLine0 | 来源:发表于2018-11-17 03:14 被阅读0次

    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


      image.png
    • 在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用法

    8.DrawerLayout布局绘制

    相关文章

      网友评论

          本文标题:2.singleLine0的知乎日报学习:Material De

          本文链接:https://www.haomeiwen.com/subject/jwxmfqtx.html