100steps / Blogs

:green_apple: 创新,只为与你分享。
134 stars 32 forks source link

Material项目浅谈 #47

Open mengming opened 8 years ago

mengming commented 8 years ago

最近重构天气预报,试了一下material design的控件。嗯比原生好看多了。 首先在AS里新建工程,可以直接新建一个带有其他控件的项目,当然这样代码会多一点,你需要去了解一下它的初始架构。 image 我这里分享的是一个带有抽屉的activity,其中NavigationView,Toolbar,FloatingActionButton,DrawerLayout的使用我就不多说了。 这里讲一下在这个应用中加入下拉刷新列表的方法。 以前使用下拉刷新的话一般使用开源库,但是google推出了SwipeRefreshLayout和RecyclerView,可以完美替代开源库的作用,而且也有动画效果,很推荐使用。 首先在xml里加入控件嵌套使用就可以了。

    <android.support.v4.widget.SwipeRefreshLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/swipe">
        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/recycler"/>
    </android.support.v4.widget.SwipeRefreshLayout>

接着在java中声明控件,要注意的是RecyclerView需要配置一个LayoutManager。

        SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {

            }
        });

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(new RecyclerAdapter());

SwipeRefreshLayout的使用比较简单,就是在onRefresh里写刷新的操作就可以的了。主要介绍一下RecyclerView的使用。

整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。 你想要控制其显示的方式,请通过布局管理器LayoutManager 你想要控制Item间的间隔(可绘制),请通过ItemDecoration 你想要控制Item增删的动画,请通过ItemAnimator (复制粘贴了一波。。。)

目前SDK中提供了三种自带的LayoutManager,能够实现三种不同布局: LinearLayoutManager 线性管理器,支持横向、纵向。 GridLayoutManager 网格布局管理器 StaggeredGridLayoutManager 瀑布流式布局管理器

ItemDecoration可以绘制分割线,当然你也可以添加其他东西作为间隔,提高了我们的设计自由度。

ItemAnimator可以设置增删的动画效果,而且也有默认动画,还不错。

接下来是Adapter了。RecyclerView自带Adapter,引入了ViewHolder提高性能。话不多说看代码

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
    public String[] datas = null;
    public RecyclerAdapter(String[] datas) {
        this.datas = datas;
    }
    //创建新View,被LayoutManager所调用
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,false);
        ViewHolder vh = new ViewHolder(view);
        return vh;
    }
    //将数据与界面进行绑定的操作
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {
        viewHolder.mTextView.setText(datas[position]);
    }
    //获取数据的数量
    @Override
    public int getItemCount() {
        return datas.length;
    }
    //自定义的ViewHolder,持有每个Item的的所有界面元素
    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView;
        public ViewHolder(View view){
            super(view);
            mTextView = (TextView) view.findViewById(R.id.text);
        }
    }
}

这就是最简单的使用方法了,创建一个ViewHolder,包含了你的item里面的控件,onCreateViewHolder就在绘制时创建ViewHolder,而onBindViewHolder是用来绑定数据的。 而RecyclerView还有一个特点就是可以很方便的使用多种布局作为item。通过getItemViewType方法,使每个位置的item返回不同的type,在onCreateViewHolder中通过不同的type创建不同的ViewHolder,就可以实现显示不同的布局了。 推荐两篇RecyclerView的文章 http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1118/2004.html http://blog.csdn.net/lmj623565791/article/details/45059587 这两个控件还有很多使用技巧,后面慢慢更新吧。