Recyclerview使用体验(一)
来源:互联网 发布:java虚拟机占用内存 编辑:程序博客网 时间:2024/05/18 13:44
仅作为自己在使用recyclerview过程中一点点记录,
- 使用Recyclerview已经有一定时间,项目中也用了很久,总觉得该亲自整理一下,也算是自己回顾一下Recyclerview的知识,然后尝试去深层次的了解Recyclerview,只会用,不了解,也不算是会用;
- 如果你想尝试Recyclerview,正好又看到这个文章,嗯哼0.0,那你就好好看看吧。
废话不多说,直接开整
首先当然是添加依赖,根据当前sdk版本,选择合适的依赖,Recyclerview是V7包提供的,所以呢?
compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.android.support:recyclerview-v7:24.0.0'
第一个不必说,第二个就是我们需要的导入的包了,rebuild一下,看看是否导入成功,只要根据自己使用的sdk版本,一般是没有意外的,如果有了
很明显是你导入错了。导入成功,接下来就是布局里使用了
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefresh" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.SwipeRefreshLayout> </LinearLayout>
- 布局很简单,SwipeRefreshLayout包裹Recyclerview,实现下拉刷新
回到代码中
Recyclerview和SwipeRefreshLayout初始化完成,开始加载数据实现Recyclerview的多种实现布局;public class MainActivity extends AppCompatActivity { @InjectView(R.id.recyclerview) RecyclerView recyclerview; @InjectView(R.id.swipeRefresh) SwipeRefreshLayout swipeRefresh; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.inject(this); initData(); }}
有了数据之后,和ListView一样,需要设置适配器,但是Recyclerview得适配器和ListView适配器,不完全一样;假设Recyclerview适配器定义为Adapter
public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null;}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {}@Overridepublic int getItemCount() { return 0;}}
我们真正要实现的是重写一个ViewHolder,继承 Recyclerview.ViewHolder;
public class ItemHolder extends RecyclerView.ViewHolder { public ItemHolder(View itemView) { super(itemView); }}
设置Adapter的布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="60dp" android:paddingLeft="10dp" android:paddingTop="10dp"> <ImageView android:id="@+id/imageView" android:layout_width="40dp" android:layout_height="40dp" /> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_vertical" android:layout_marginLeft="15dp" android:drawableBottom="@drawable/line" android:ellipsize="end" android:gravity="center_vertical" android:text="123" android:textColor="@color/colorAccent" android:textSize="16sp" /></LinearLayout></LinearLayout>
回到Adapter
public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private ArrayList<String> datas; public Adapter(Context context, ArrayList<String> datas) { this.context = context; this.datas = datas; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ItemHolder(LayoutInflater.from(context).inflate(R.layout.item_adapter, null)); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { } @Override public int getItemCount() { return datas.size() == 0 ? 0 : datas.size(); } public class ItemHolder extends RecyclerView.ViewHolder { private ImageView imageView; private TextView textView; public ItemHolder(View itemView) { super(itemView); this.imageView = (ImageView) itemView.findViewById(R.id.imageView); this.textView = (TextView) itemView.findViewById(R.id.textView); } }}
最后数据绑定
/** * Creation time : 2016/11/22 21:01 * Fix time : 2016/11/22 21:01 */public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private List<String> datas; public Adapter(Context context, List<String> datas) { this.context = context; this.datas = datas; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ItemHolder(LayoutInflater.from(context).inflate(R.layout.item_adapter, null)); }//绑定数据 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { bindViewHolder((ItemHolder) holder); } private void bindViewHolder(ItemHolder holder) { for (int i = 0; i < this.datas.size() - 1; i++) { holder.textView.setText(datas.get(i)); holder.imageView.setBackgroundResource(R.drawable.musiclogo144); } } @Override public int getItemCount() { return datas.size() == 0 ? 0 : datas.size(); } public class ItemHolder extends RecyclerView.ViewHolder { private ImageView imageView; private TextView textView; public ItemHolder(View itemView) { super(itemView); this.imageView = (ImageView) itemView.findViewById(R.id.imageView); this.textView = (TextView) itemView.findViewById(R.id.textView); } }}
回到加载数据部分
/** * 请求数据 */ private void initData() { //假设联网请求数据N条,这里我就用本地数据 data = null; for (int i = 0; i < 40; i++) { data.add(i, i + ". 成功请求数据"); } adapter = new Adapter(MainActivity.this, data); recyclerview.setAdapter(adapter); }
编译运行
但是什么都没有,因为我们没有设置LayoutManager,Recyclerview需要设置LayoutManager,才能显示;
public class MainActivity extends AppCompatActivity { @InjectView(R.id.recyclerview) RecyclerView recyclerview; @InjectView(R.id.swipeRefresh) SwipeRefreshLayout swipeRefresh; private static final int GET = 1; private LinearLayoutManager linearLayoutManager; private GridLayoutManager gridLayoutManager; private StaggeredGridLayoutManager staggeredGridLayoutManager; private List<String> data; private RecyclerView.LayoutManager layoutmanager; private Adapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.inject(this); linearLayoutManager = new LinearLayoutManager(MainActivity.this); //常见纵向布局// linearLayoutManager = new LinearLayoutManager(MainActivity.this,LinearLayoutManager.HORIZONTAL,true); //水平方向,最后一个参数是否逆向 gridLayoutManager = new GridLayoutManager(MainActivity.this, 2); //类似GridView的格式,第二个参数为行的item数量,同理,也有水平方向的GridLayoutManager; staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); //瀑布流,第一个为每行item数量 layoutmanager = linearLayoutManager; //默认为纵向的Recyclerview; initData(); } @Override public boolean onCreateOptionsMenu(Menu item) { getMenuInflater().inflate(R.menu.main_menu, item); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.linearlayout: layoutmanager = linearLayoutManager; initData(); break; case R.id.gridlayout: layoutmanager = gridLayoutManager; break; case R.id.staggeredgridlayout: layoutmanager = staggeredGridLayoutManager; initData(); break; default: layoutmanager = linearLayoutManager; initData(); break; } return super.onOptionsItemSelected(item); } /** * 请求数据 */ private void initData() { //假设联网请求数据N条,这里我就用本地数据 data = new ArrayList<>(); for (int i = 0; i < 40; i++) { data.add(i + ". 成功请求数据"); } recyclerview.setLayoutManager(layoutmanager); adapter = new Adapter(MainActivity.this, data); recyclerview.setHasFixedSize(true); recyclerview.setAdapter(adapter); }}
默认的LayoutManager
那么切换LayoutManager为GridLayoutManager,效果会是什么样呢
最后,切换到瀑布流
什么效果都没有,这是为什么呢,因为,设置瀑布流,我们需要对item的间隙进行设置,不然没有效果
首先自定义ItemDecoration
public class ItemDecoration extends RecyclerView.ItemDecoration { private int space; public ItemDecoration(int space) { this.space = space; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { outRect.left = space; outRect.right = space; outRect.bottom = space; if (parent.getChildAdapterPosition(view) == 0) { outRect.top = space; } }}
设置间隙
* 请求数据 */ private void initData() { //假设联网请求数据N条,这里我就用本地数据 data = new ArrayList<>(); for (int i = 0; i < 40; i++) { data.add(i + ". 成功请求数据"); } recyclerview.setLayoutManager(layoutmanager); if(layoutmanager.equals(staggeredGridLayoutManager)) { //针对瀑布流,设置间隙 recyclerview.addItemDecoration(new ItemDecoration(15)); } adapter = new Adapter(MainActivity.this, data); recyclerview.setHasFixedSize(true); recyclerview.setAdapter(adapter); }
重新编译运行,搞定
这算是Recyclerview的简单使用,实现三种模式,已经搞定,还有很多细节,留到下一篇,仔细讲解。
- Recyclerview使用体验(一)
- RecyclerView初体验(一)
- RecyclerView使用(一)
- RecyclerView使用初体验
- RecyclerView 使用全体验
- RecyclerView使用完全指南,是时候体验新控件了(一)
- 商城项目实战 | 4.1 RecyclerView 使用完全解析 体验艺术般的控件(一)
- RecyclerView使用详解(一)
- RecyclerView使用详解(一)
- RecyclerView使用详解(一)
- RecyclerView使用详解(一)
- RecyclerView使用详解(一)
- RecyclerView使用进阶(一)
- RecyclerView使用详解(一)
- RecyclerView使用详解(一)
- RecyclerView的使用(一)
- RecyclerView使用详解(一)
- RecyclerView的使用(一)
- 微信 WCDB 正式开源——高效易用的移动数据库框架
- linux 常用命令
- ORACLE初学第二篇
- bzoj 4310: 跳蚤 (后缀数组+二分+ST表)
- Android中TextView属性全纪录
- Recyclerview使用体验(一)
- 关于SwipeRefreshLayout的刷新事件
- 关于Android适配,常用这几种就够了
- Android获取设备唯一标识
- - Unable to add window -- token null is not valid; is your activity running?
- Error:Execution failed for task ':app:transformNative_libsWithStripDebugSymbolForDebug'. > java.lang.NullPointerExcep
- win下的问题积累
- Android开发中--正则表达式的实用
- Android开发--更换字体