RecyclerView的使用全解

public class MyHolder extends RecyclerView.ViewHolder { public ImageView icon; public TextView textView; //实现的方法 public MyHolder(View itemView) { super(itemView); icon= (ImageView) itemView.findViewById(R.id.item_iv_icon); textView= (TextView) itemView.findViewById(R.id.item_tv_title); } }

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

封装RecyclerView通用适配器


好处:1.数量动态 2.类型不限 Map<Integer,View> 作用:封装了Adapter编写的冗余代码,提供简洁的基类

  • 1

  • 2

  • 3

思路:不写死空间变量,而采用Map方式。

步骤:先关注比较火的控件库 使用一下,看一下好处 学习下底层源代码 自己动手体会

①封装了BaseHolder

//抽取BaseHolder继承RecyclerView.ViewHolder public class BaseHolder extends RecyclerView.ViewHolder { //不写死控件变量,而采用Map方式 private HashMap<Integer, View> mViews = new HashMap<>(); public BaseHolder(View itemView) { super(itemView); } /** *获取控件的方法 */ public<T> T getView(Integer viewId){ //根据保存变量的类型 强转为该类型 View view = mViews.get(viewId); if(view==null){ view= itemView.findViewById(viewId); //缓存 mViews.put(viewId,view); } return (T)view; } /** *传入文本控件id和设置的文本值,设置文本 */ public BaseHolder setText(Integer viewId, String value){ TextView textView = getView(viewId); if (textView != null) { textView.setText(value); } return this; } /** * 传入图片控件id和资源id,设置图片 */ public BaseHolder setImageResource(Integer viewId, Integer resId) { ImageView imageView = getView(viewId); if (imageView != null) { imageView.setImageResource(resId); } return this; } //...还可以扩展出各种控件。 //Fluent API 链式api obj.setxxx().setyyy().... }

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

  • 27

  • 28

  • 29

  • 30

  • 31

  • 32

  • 33

  • 34

  • 35

  • 36

  • 37

  • 38

  • 39

  • 40

  • 41

  • 42

  • 43

②Holder封装好之后,再封装BaseAdapter

封装的时候,部分参数可以选择由外部的构造函数或者set方法 public class BaseAdapter<T> extends RecyclerView.Adapter<BaseHolder> { private List<T> mList = new ArrayList<>(); private int layoutId; public BaseAdapter(int layoutId,List<T> list){ this.layoutId=layoutId; this. mList=list; } //onCreateViewHolder用来给rv创建缓存 @Override public BaseHolder onCreateViewHolder(ViewGroup parent, int viewType) { //参数3 判断条件 true 1.打气 2.添加到paraent // false 1.打气 (参考parent的宽度) View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false); BaseHolder holder = new BaseHolder(view); return holder; } //onBindViewHolder给缓存控件设置数据 @Override public void onBindViewHolder(BaseHolder holder, int position) { T item = mList.get(position); convert(holder,item); } protected void convert(BaseHolder holder, T item) { //什么都没有做 } //获取记录数据 @Override public int getItemCount() { return mList.size(); } }

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

  • 27

  • 28

  • 29

  • 30

  • 31

  • 32

③封装之后,继承实现

/** *1.extends 把父类的代码继承过来。 可以少写很多代码。 *2.因为是全部拿来的代码,所以不是所有的代码都适合当前。对于不适合当前的代码(方法) * 我们可选择@Override 覆盖|重写 */ public class MyHomeAdapter extends BaseAdapter<String> { public MyHomeAdapter(List<String> list) { super(R.layout.main_recyclerview_item, list); } @Override protected void convert(BaseHolder holder, String item) { holder.setText(R.id.item_tv_title,item).setImageResource(R.id.image,R.drawable.ic_default); } }

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

④封装之后,代码实现

public class HomeFragment extends Fragment { private List<String> list; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_home, container, false); //获取rv控件 RecyclerView rv = (RecyclerView) view.findViewById(R.id.rv); b rv.setLayoutManager(new LinearLayoutManager(getContext())); initData(); //设置Adapter MyHomeAdapter adapter = new MyHomeAdapter(list); rv.setAdapter(adapter); return view;

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

案例1


依赖

布局文件activity_recycler_view.xml:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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.support.v7.widget.RecyclerView android:id="@+id/id_recyclerview" android:divider="#FFB900" android:dividerHeight="1dp" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout>

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

让我们来看看变化最大的Adaper:

class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> { private List<String> mList; private Context mContext;; public HomeAdapter(Context mContext,List<String>mList){ this.mContext=mContext; this.mList=mList; } public void removeData(int position) { mList.remove(position); notifyItemRemoved(position); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyViewHolder holder = new MyViewHolder(LayoutInflater.from( mContext).inflate(R.layout.item_recycler, parent, false)); return holder; } @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { holder.tv.setText(mList.get(position)); } @Override public int getItemCount() { return mList.size(); } class MyViewHolder extends RecyclerView.ViewHolder { TextView tv; public MyViewHolder(View view) { super(view); tv = (TextView) view.findViewById(R.id.tv_item); } } }

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

  • 27

  • 28

  • 29

  • 30

  • 31

  • 32

  • 33

  • 34

  • 35

  • 36

  • 37

  • 38

  • 39

  • 40

  • 41

  • 42

  • 43

  • 44

  • 45

最大的改进就是对ViewHolder进行了封装定义,不用自己去自定义了,另外Adaper继承RecyclerView.Adapter,在onCreateViewHolder加载条目布局,在onBindViewHolder中将视图与数据进行绑定。

布局文件item_recycler.xml:

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:background="@android:color/white" android:layout_height="wrap_content" > <TextView android:id="@+id/tv_item" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:text="moon" /> </FrameLayout>

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结语

网上高级工程师面试相关文章鱼龙混杂,要么一堆内容,要么内容质量太浅, 鉴于此我整理了上述安卓开发高级工程师面试题以及答案。希望帮助大家顺利进阶为高级工程师。
目前我就职于某大厂安卓高级工程师职位,在当下大环境下也想为安卓工程师出一份力,通过我的技术经验整理了面试经常问的题,答案部分是一篇文章或者几篇文章,都是我认真看过并且觉得不错才整理出来。

大家知道高级工程师不会像刚入门那样被问的问题一句话两句话就能表述清楚,所以我通过过滤好文章来帮助大家理解。

1307页字节跳动Android面试真题解析火爆全网,完整版开放下载

现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕!我这边专门针对Android开发工程师整理了一套【Android进阶学习视频】、【全套Android面试秘籍】、【Android知识点PDF】。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

容对你有帮助,可以扫码获取!!(备注:Android)**

结语

网上高级工程师面试相关文章鱼龙混杂,要么一堆内容,要么内容质量太浅, 鉴于此我整理了上述安卓开发高级工程师面试题以及答案。希望帮助大家顺利进阶为高级工程师。
目前我就职于某大厂安卓高级工程师职位,在当下大环境下也想为安卓工程师出一份力,通过我的技术经验整理了面试经常问的题,答案部分是一篇文章或者几篇文章,都是我认真看过并且觉得不错才整理出来。

大家知道高级工程师不会像刚入门那样被问的问题一句话两句话就能表述清楚,所以我通过过滤好文章来帮助大家理解。

[外链图片转存中…(img-QtrfHXmr-1712295357202)]

现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕!我这边专门针对Android开发工程师整理了一套【Android进阶学习视频】、【全套Android面试秘籍】、【Android知识点PDF】。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerView 是 Android 系统中的一个视图组件,它可以用来展示列表、网格等数据集合。相对于 ListView 和 GridViewRecyclerView 更加灵活,支持自定义布局和动画等功能。使用 RecyclerView,我们需要定义一个 Adapter 来管理数据,以及一个 LayoutManager 来控制布局方式。 以下是 RecyclerView使用步骤: 1. 在布局文件中定义 RecyclerView 组件。 2. 定义 RecyclerView 的 Adapter,继承自 RecyclerView.Adapter,并实现三个方法:onCreateViewHolder、onBindViewHolder 和 getItemCount。 3. 定义 RecyclerView 的 LayoutManager,可以使用系统提供的 LinearLayoutManager、GridLayoutManager 或者自定义实现。 4. 在 Activity 或者 Fragment 中获取 RecyclerView 对象,并设置 Adapter 和 LayoutManager。 5. 可选的,可以设置 RecyclerView 的 ItemDecoration 和 ItemAnimator,用于美化界面和实现动画效果。 下面是一份简单的示例代码: 1. 在布局文件中定义 RecyclerView 组件: ``` <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 定义 RecyclerView 的 Adapter: ``` public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<String> mData; public MyAdapter(List<String> data) { mData = data; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.textView.setText(mData.get(position)); } @Override public int getItemCount() { return mData.size(); } static class ViewHolder extends RecyclerView.ViewHolder { TextView textView; ViewHolder(@NonNull View itemView) { super(itemView); textView = itemView.findViewById(R.id.text_view); } } } ``` 3. 定义 RecyclerView 的 LayoutManager: ``` RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); ``` 4. 在 Activity 或者 Fragment 中获取 RecyclerView 对象,并设置 Adapter 和 LayoutManager: ``` RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(new MyAdapter(data)); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值