Android Recycleview的用法
2017-12-20 17:19
543 查看
前言
最近没得什么项目可以做,闲来无事想写一些东西,看了看以前做的项目,用到的最多的就是列表了,今天就说一下recycleview。这个世界并不是掌握在那些嘲笑者的手中,而恰恰掌握在能够经受得住嘲笑与批评仍不断往前走的人手中。
RecycleView 的介绍
自Android 5.0之后,谷歌公司推出了RecylerView控件,主要用于列表的展示是一个很强大的滑动组件,说到这里就会想到不是已经有listview吗?为啥还要弄一个recycleview出来了?确实我觉得这个问题回答很简单,之所以出他是因为他肯定比listview强大的,不然谷歌为啥要出它。recycleview与listview的比较
相同:都可以实现垂直方向的滚动列表效果;都需要使用适配器(Adapter)。
不同点:ListView只能实现垂直滚动列表,但RecyclerView还可以实现水平、多列、跨列等复杂的滚动列表;RecyclerView不但需要Adapter,还必须有LayoutManager,用法更复杂一些。
recycleview说:你listview管不了的我要管,你listview管的了的我也要管,我recycleview说的,listview我吃定了,耶稣也留不住。
listview说:牛bi!
线性布局的Recycleview
效果图:先来看看XML的布局:
<android.support.v7.widget.RecyclerView android:id="@+id/xian_recycle" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> </android.support.v7.widget.RecyclerView>
再来看看每一个Item的布局是怎样的
<?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="wrap_content" android:layout_marginTop="5dp" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="100dp" android:orientation="horizontal"> <ImageView android:id="@+id/img" android:layout_width="150dp" android:layout_height="match_parent" /> <TextView android:id="@+id/name" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:textColor="#363535" android:textSize="14sp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#cfcdcd"></View> </LinearLayout>
adapter的写法
public class XianAdapter extends RecyclerView.Adapter<XianAdapter.XianHolder> { private Context context = null; //数据集合 private ArrayList<Name> list = null; //点击事件的接口 private ItemClick click = null; public XianAdapter(Context context) { this.context = context; list = new ArrayList<>(); } public ItemClick getClick() { return click; } public void setClick(ItemClick click) { this.click = click; } public ArrayList<Name> getList() { return list; } public void setList(ArrayList<Name> list) { this.list = list; } @Override public XianHolder onCreateViewHolder(ViewGroup parent, int viewType) { //添加item的布局文件 View view = LayoutInflater.from(context).inflate(R.layout.xian_recycle_item, parent, false); XianHolder holder = new XianHolder(view); return holder; } @Override public void onBindViewHolder(XianHolder holder, final int position) { //给每个item设置数据 if (list != null) { holder.img.setImageResource(list.< 4000 span class="hljs-keyword">get(position).getImg()); holder.name.setText(list.get(position).getName()); } //给每个item添加监听 if (click != null) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { click.ItemClick(position); } }); } } @Override public int getItemCount() { //列表的长度 return list.size(); } class XianHolder extends RecyclerView.ViewHolder { //找到布局文件里面的控件 private ImageView img = null; private TextView name = null; public XianHolder(View itemView) { super(itemView); img = (ImageView) itemView.findViewById(R.id.img); name = (TextView) itemView.findViewById(R.id.name); } } }
这个地方我做了一个数据的类Name
public class Name { private String name = null; private int img = 0; public Name(String name, int img) { this.name = name; this.img = img; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getImg() { return img; } public void setImg(int img) { this.img = img; } }
还有一个接口文件
public interface ItemClick { void ItemClick(int position); }
再来看看主页面是怎么写的:
public class XianActivity extends AppCompatActivity{ private RecyclerView recyclerView = null; private XianAdapter adapter = null; private ArrayList<Name> list = null; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { initData(); super.onCreate(savedInstanceState); setContentView(R.layout.activity_xian); initView(); } public void initView(){ //找到recycleview recyclerView = (RecyclerView) findViewById(R.id.xian_recycle); //指定布局方式这个地方时线性布局 RecyclerView.LayoutManager manager = new LinearLayoutManager(this); //指定好的设置给recycleview recyclerView.setLayoutManager(manager); //适配器弄出来 adapter = new XianAdapter(this); //把添加好数据的结合传给适配器 adapter.setList(list); //监听也是一样 adapter.setClick(click); //recycleview设置适配器 recyclerView.setAdapter(adapter); //adapter更新数据 adapter.notifyDataSetChanged(); } //item的监听事件 private ItemClick click = new ItemClick() { @Override public void ItemClick(int position) { //点击弹出每一行的名字 Toast.makeText(XianActivity.this, list.get(position).getName(), Toast.LENGTH_SHORT).show(); } }; //插入数据 public void initData(){ list = new ArrayList<>(); list.add(new Name(" 蒙奇·D·路飞",R.mipmap.one)); list.add(new Name(" 罗罗亚·索隆 ",R.mipmap.two)); list.add(new Name("香吉士",R.mipmap.three)); list.add(new Name(" 妮可·罗宾",R.mipmap.four)); list.add(new Name("娜美",R.mipmap.five)); list.add(new Name("乌索普",R.mipmap.six)); list.add(new Name("托尼托尼·乔巴",R.mipmap.seven)); list.add(new Name("弗兰奇",R.mipmap.eight)); list.add(new Name("布鲁克 ",R.mipmap.nine)); } }
recycleview网格布局
效果图:要实现这种网格的效果你只需要稍微的改动一下item的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_margin="5dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:scaleType="fitXY" android:id="@+id/img" android:layout_width="150dp" android:layout_height="100dp" /> <TextView android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textColor="#363535" android:textSize="14sp" /> </LinearLayout>
然后改一句话就能实现
把线性布局的:
RecyclerView.LayoutManager manager = new LinearLayoutManager(this);
改成
RecyclerView.LayoutManager manager = new GridLayoutManager(this, 3);
这句话就是用网格布局3表示的一行有多少个。
Recycleview 瀑布流
效果图:改下item布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="#ffffff" android:layout_margin="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:scaleType="fitXY" android:id="@+id/img" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textColor="#363535" android:textSize="14sp" /> </LinearLayout>
然后改一句话就能实现
把线性布局的:
RecyclerView.LayoutManager manager = new LinearLayoutManager(this);
改成
RecyclerView.LayoutManager manager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
这样就搞定了瀑布流。
这篇就写到这里了。
相关文章推荐
- Android开发之recycleView详解代码,看完包你熟练掌握recycleView的用法。转自网络经典文章
- Android开发之recycleView详解代码,看完包你熟练掌握recycleView的用法。转自网络经典文章
- Android之---RecycleView简单介绍(各种用法的简介)
- Android--RecycleView的简单实用
- Android使用RecycleView实现魅族手机通讯录界面
- android webview用法小结2 java与javascript的交互
- android RecycleView Adapter简单封装
- Android 使用RecycleView和CardView
- Android RecyclerView的基本用法
- Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法
- Android使用RecycleView实现拖拽交换item位置
- Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法
- Android ViewHolder的作用与用法
- android开发游记:RecycleView 实现复杂首页布局三种方式
- Android_RecycleView基本详解
- RecycleView的基本用法
- Android截屏截图方法汇总(Activity、View、ScrollView、ListView、RecycleView、WebView截屏截图)
- Android RecycleView(四)——时间轴
- android webView用法
- Android高级之xUtils框架(一):ViewUtils的用法