第一步:
在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>