第一行代码笔记 下拉刷新卡片现实上滑隐藏标题栏的demo

第一步:

在gradle中添加

   compile 'com.android.support:cardview-v7:23.0.0'
//    图片加载库
    compile 'com.github.bumptech.glide:glide:3.7.0'
    compile 'com.android.support:recyclerview-v7:23.0.0'
    compile 'com.android.support:design:23.2.0'
第二步:

创建一个实体类

public class TestData {

    private String name;
    private String  bit;

    public TestData(String name, String bit) {
        this.name = name;
        this.bit = bit;
    }

    @Override
    public String toString() {
        return "TestData{" +
                "name='" + name + '\'' +
                ", bit='" + bit + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBit() {
        return bit;
    }

    public void setBit(String bit) {
        this.bit = bit;
    }
}
第三步:

创建recycleview的子item的布局名为:card_layout

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_margin="6dp"
    app:cardCornerRadius="10dp">

   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical">

       <!--scaleType时图片保存原有比例填充整个控件-->
       <ImageView
           android:id="@+id/metaril_image"
           android:scaleType="centerCrop"
           android:layout_gravity="center_horizontal"
           android:layout_width="match_parent"
           android:layout_height="120dp"
           android:layout_marginTop="30dp"
           />

       <TextView
           android:id="@+id/metaril_text"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center_horizontal"
           android:layout_margin="5dp"
           android:textSize="16sp"/>
   </LinearLayout>

</android.support.v7.widget.CardView>

第四步:

创建recycleview的adapter

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> {

    private Context context;
    private List<TestData> dataList;

    public TestAdapter(List<TestData> dataList) {
        this.dataList = dataList;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if ( null == context){
            context = parent.getContext();
        }
        View  view = LayoutInflater.from(context).inflate(R.layout.card_layout,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        TestData testData = dataList.get(position);
        holder.textView.setText(testData.getName());
//       Glide用法,先传入一个contenxt或者activity或者fragment然后load加载可以是图片url可以是本地路径,可以释怀资源id
//        最后通过into将要付值的控件加入就可以了,用glide做好了内存溢出的处理。
        Glide.with(context).load(testData.getBit()).into(holder.imageView);

    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder{
        CardView cardView;
        ImageView imageView;
        TextView textView;


        public ViewHolder(View itemView) {
            super(itemView);
            cardView = (CardView) itemView;
            imageView = (ImageView) itemView.findViewById(R.id.metaril_image);
            textView = (TextView) itemView.findViewById(R.id.metaril_text);

        }
    }
}
第五步,创建activity

/**
 * 悬浮按钮和可交互提示,下拉刷新,上滑隐藏标题栏,下滑出现标题栏,Snackbar使用
 */
public class MateriSumActivity extends AppCompatActivity implements View.OnClickListener {

    private FloatingActionButton fab;
    private RecyclerView recyclerview;
    private List<TestData> dataList = new ArrayList<>();
    private TestAdapter testAdapter;
    private SwipeRefreshLayout refresh;
    private Toolbar toolbar;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_materi_sum);
        initDatas();
        initView();
    }

    private void initView() {
//        FloatingActionButton和普通的button用法相同
        fab = ((FloatingActionButton) findViewById(R.id.fab));
        fab.setOnClickListener(this);

//        添加toolbar
        toolbar = ((Toolbar) findViewById(R.id.metaril_toolbar));
        setSupportActionBar(toolbar);


        recyclerview = ((RecyclerView) findViewById(R.id.materil_recycle));
        LinearLayoutManager manager = new  LinearLayoutManager(this);
//        GridLayoutManager manager = new GridLayoutManager(this,2);
        recyclerview.setLayoutManager(manager);
        testAdapter = new TestAdapter(dataList);
        recyclerview.setAdapter(testAdapter);

        refresh = ((SwipeRefreshLayout) findViewById(R.id.refresh));
//        这里设置这个刷新提示的颜色。
        refresh.setColorSchemeResources(R.color.colorPrimary);
        refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
//                去网络请求最新数据。
                refreshData();
            }
        });

    }

    private void refreshData(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
//                此处上面开了子线程,但只能在主线程更新UI所以这里回到主线程
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
//                        更新数据源,然后在这里刷新数据
                        initDatas();
                        testAdapter.notifyDataSetChanged();
//                        让刷新提示消失
                        refresh.setRefreshing(false);

                    }
                });

            }
        }).start();
    }

    private void initDatas() {
        TestData testData = new TestData("童话镇", "http://a.hiphotos.baidu.com/image/pic/item/562c11dfa9ec8a1333d2bafff503918fa1ecc0e1.jpg");
        dataList.add(testData);
        TestData testData1 = new TestData("灰姑娘", "http://a.hiphotos.baidu.com/image/pic/item/37d12f2eb9389b50572ebf5b8735e5dde6116ee1.jpg");
        dataList.add(testData1);
        TestData testData2 = new TestData("白雪公主", "http://d.hiphotos.baidu.com/image/pic/item/b58f8c5494eef01f11c545cce2fe9925bd317de1.jpg");
        dataList.add(testData2);
        TestData testData3 = new TestData("美人鱼", "http://a.hiphotos.baidu.com/image/pic/item/7aec54e736d12f2ea1d5f3694dc2d562843568e2.jpg");
        dataList.add(testData3);
        TestData testData4 = new TestData("彼得潘", "http://a.hiphotos.baidu.com/image/pic/item/08f790529822720e5c3f3afa79cb0a46f21fab39.jpg");
        dataList.add(testData4);
        TestData testData5 = new TestData("红房子", "http://c.hiphotos.baidu.com/image/pic/item/3812b31bb051f819cc8c8ae5dfb44aed2f73e7f0.jpg");
        dataList.add(testData5);
        TestData testData6 = new TestData("杰克", "http://d.hiphotos.baidu.com/image/pic/item/023b5bb5c9ea15cef55c4609b4003af33a87b204.jpg");
        dataList.add(testData6);
        TestData testData7 = new TestData("糖果屋", "http://f.hiphotos.baidu.com/image/pic/item/00e93901213fb80e0ee553d034d12f2eb9389484.jpg");
        dataList.add(testData7);
        TestData testData8 = new TestData("心爱的玻璃鞋", "http://g.hiphotos.baidu.com/image/pic/item/faf2b2119313b07e5c56ab0e0ed7912396dd8cc9.jpg");
        dataList.add(testData8);
        TestData testData9 = new TestData("睿智的河水", "http://c.hiphotos.baidu.com/image/pic/item/6f061d950a7b02084993e1d567d9f2d3572cc8a8.jpg");
        dataList.add(testData9);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.fab:
                Toast.makeText(this, "这个浮这的按钮被电击了", Toast.LENGTH_SHORT).show();
                useSnackBar(v);
                break;
        }
    }

    /**
     * SnackBar使用和toast使用类似,只是可以添加点击,需要传入一个view,可以是当前界面任意view
     * 他会自动去寻找这个view的最外层布局,用于展示自己。参数2:显示的内容,参数3:是snackbar显示的时常
     * setAction添加一个点击事件
     *
     * @param view
     */
    private void useSnackBar(View view) {
        Snackbar.make(view, "删除数据", Snackbar.LENGTH_LONG).setAction("undo", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "这个Snackbar按钮被电击了", Toast.LENGTH_SHORT).show();

            }
        }).show();

    }
}

activity的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_materi_sum"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#80aca9">
    <!--CoordinatorLayout布局是加强班的framlayout可以监听所有子控件的各种事件,然后自动帮助我们自己做出最为合理的响应-->
    <!--例如弹出的snackbar遮挡住了fab,但用了CoordinatorLayout后snackbar弹出时,fab会上移。不遮盖住-->
    <!--注意CoordinatorLayout只监听它的子控件,snackbar因为传入的view为fab的view所以也算CoordinatorLayout的子控件(activity中)-->
    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!--AppBarLayout是一个垂直的linerlayout里面做了很多滚动事件的封装-->
        <!--添加了AppBarLayout后,只要在Toolbar加入layout_scrollFlags如下-->
        <!--就可以实现上滑隐藏标题栏,下拉又显示出来-->
        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.v7.widget.Toolbar
                android:id="@+id/metaril_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:layout_scrollFlags="scroll|enterAlways|snap"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:theme="@style/Base.ThemeOverlay.AppCompat.ActionBar" />
        </android.support.design.widget.AppBarLayout>


        <!--指定一个行为layout_behavior同时添加上面AppBarLayout可以避免RecyclerView遮盖住Toolbar-->
        <!--SwipeRefreshLayout实现下拉刷新,因为现在最外层是SwipeRefreshLayout了,所以layout_behavior改添加到swip上-->
        <android.support.v4.widget.SwipeRefreshLayout
            android:layout_width="match_parent"
            android:id="@+id/refresh"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            >

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

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_margin="16dp"
            android:src="@mipmap/rn11"
            app:elevation="10dp" />


    </android.support.design.widget.CoordinatorLayout>


</RelativeLayout>






































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值