RecyclerView的使用和与ListView的一些不同之处
来源:互联网 发布:javascript插件dll 编辑:程序博客网 时间:2024/05/16 18:57
对于RecyclerView,我想大家肯定也不陌生,毕竟已经发布很长时间了,本文是为了给小白入门用的,大神可忽略,文中错误或者表达不准确的地方还请各位不吝赐教。
一、AS中使用RecyclerView的准备工作
android studio中使用RecyclerView的准备工作其实很少,只需要一步即可:
File ——-> Project Structure ——-> app———> Dependencies ———> “+” ——->”Library Dependency” ——->搜索”com.android.support:recyclerview”然后选中搜到的那个库 ———>”OK” ———>”OK” 好了,让项目飞一会……
二、RecyclerView的使用
1.在布局文件layout中添加RecyclerView。
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerView_shareAPKPackageLikeQQActivity"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"></android.support.v7.widget.RecyclerView>
2.在Activity中先找到RecyclerView,然后为其设置布局管理器
@ViewById(R.id.recyclerView_MainActivity) protected RecyclerView recyclerView; recyclerView.setLayoutManager(new LinearLayoutManager(context));
3.现在去创建一个继承自RecyclerView.Adapter的MyRecyclerViewAdapter类,先不要实现内部方法,然后在这个类中添加一个内部类MyViewHolder,
当然继承自RecyclerView.ViewHolder类
public class MyRecycleViewAdapter extends RecyclerView.Adapter<MyRecycleViewAdapter.MyViewHolder> { private Context context; private String[] itemText; private int[] itemImg; /** * 构造方法 * * @param context * @param itemImg * @param itemText */ public MyRecycleViewAdapter(Context context, int[] itemImg, String[] itemText) { this.context = context; this.itemImg = itemImg; this.itemText = itemText; } /** * @param parent * @param viewType * @return */ @Override public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { final View itemRoot = LayoutInflater.from(context).inflate(R.layout.recycleview_cell, parent, false); MyViewHolder mViewHolder = new MyViewHolder(itemRoot); return mViewHolder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.img.setImageDrawable(context.getResources().getDrawable(itemImg[position])); holder.text.setText(itemText[position]); } @Override public int getItemCount() { return itemImg.length; } class MyViewHolder extends RecyclerView.ViewHolder { ImageView img; TextView text; public MyViewHolder(View itemView) { super(itemView); img = (ImageView) itemView.findViewById(R.id.img_recycleView); text = (TextView) itemView.findViewById(R.id.tv_recycleView); } }}
4.在Activity中创建adapter的对象,然后为RecyclerView设置Adapter,完成。
// 设置适配器 mAdapter = new MyRecycleViewAdapter(context, itemImg, itemText); recyclerView.setAdapter(mAdapter);
—————————————我是一条安静的分割线—————————————–
以上步骤做完,那么基本的RecyclerView就能够呈现在屏幕上了,但是有这么几点不舒服的地方:
1.点击item没有任何效果,分不清是点击了还是没有
2.需要为item添加点击事件,以便完成后续操作
3.如果我想要item多样式显示效果,我该怎么办呢?
对于问题1,我们可以写一个Drawable,来作为item的背景:
recyclerview_item_bg.xml<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <color android:color="#ff9a9a9a" /> </item> <item android:state_pressed="false"> <color android:color="#00000000" /> </item></selector>
然后在Adapter类中的onCreateViewHolder方法中为itemRoot设置背景(只需要下面三行代码中的第三行即可):
final View itemRoot = LayoutInflater.from(context).inflate(R.layout.recycleview_cell, parent, false); MyViewHolder mViewHolder = new MyViewHolder(itemRoot); itemRoot.setBackground(context.getResources().getDrawable(R.drawable.recyclerview_item_bg));
这样,再点击item的时候你会发现item的背景颜色变化了。
对于问题2,请参考我的另一篇文章,“RecyclerView的item点击事件监听器”地址:http://blog.csdn.net/gxp1182893781/article/details/76736282
对于问题3,我们需要在Adapter类中重写getItemViewType方法:
@Override public int getItemViewType(int position) { return infos.get(position).getType(); }
这里的infos是想要展示的数据构成的Javabean,里面有一个域叫type,用来标识某个特定对象是什么类型的(比如,0表示样式0,1表示样式1…)
注意看,重写后直接让返回值返回了type,然后系统会把这个type传给onCreateViewHolder方法的第二个参数,这样我们就可以根据这个type的值去确定到底要使用哪一个item_cell布局文件了。
@Override public MyListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyListViewHolder mViewHolder; if (viewType == 0) { mViewHolder = new MyListViewHolder(LayoutInflater.from(context).inflate(R.layout.childlist_cell_type0_share_apkpackage_like_qq, parent, false),viewType); } else { mViewHolder = new MyListViewHolder(LayoutInflater.from(context).inflate(R.layout.childlist_cell_type1_share_apkpackage_like_qq, parent, false),viewType); } return mViewHolder; }
上面代码中,我们给MyListViewHolder类传入了这个type值,这样ViewHolder就能根据type正确的找到布局文件中的各个控件了。
public MyListViewHolder(View itemView,int viewType) { super(itemView); if (viewType == 0){ icon = itemView.findViewById(R.id.icon_type0_share_apkpackage_like_qq); name = itemView.findViewById(R.id.name_type0_share_apkpackage_like_qq); lastUpdateDate = itemView.findViewById(R.id.lastUpdateDate_type0_share_apkpackage_like_qq); size = itemView.findViewById(R.id.sizePackage_type0_share_apkpackage_like_qq); }else { icon = itemView.findViewById(R.id.icon_type1_share_apkpackage_like_qq); name = itemView.findViewById(R.id.name_type1_share_apkpackage_like_qq); lastUpdateDate = itemView.findViewById(R.id.lastUpdateDate_type1_share_apkpackage_like_qq); size = itemView.findViewById(R.id.sizePackage_type1_share_apkpackage_like_qq); } }
这样,在之后的onBindViewHolder中为item_cell布局中的各个组件设置显示内容就很轻松了。
通过以上方法,我们就实现了item的多样式显示功能。
最后,一个小注意事项给大家,希望能注意一下:
在ListView的item_cell布局文件中,我们可以随意让最外层布局的宽和高为match_parent或者wrap_content。因为实际在现实的时候会按照wrap_content进行显示,只有给定具体数值时才会按照给定的数值进行显示。
但是RecyclerView来说,如果item_cell的最外层布局的宽或高定义为wrap_content,那么他会像ListView一样正常显示,但是如果定位成match_parent,那么每一个item将要铺满整个父级容器,不会像ListView一样自适应宽高,当然,如果给定具体数值也会按照给定的数值进行显示。
因此,在使用Recyclerview的时候,个人建议,使用wrap_content。
- RecyclerView的使用和与ListView的一些不同之处
- C与C++的一些不同之处
- [转]C与C++的一些不同之处
- QT5与QT4的一些不同之处
- java和C#的一些不同之处
- RecyclerView与ListView的异同
- ListView与RecyclerView的区别
- ListView、GridView、RecyclerView的使用
- ListView 和RecyclerView的比较
- RecyclerView 和 ListView的区别
- RecyclerView和ListView的异同
- RecyclerView和ListView的异同
- RecyclerView和ListView的异同
- RecyclerView和ListView的异同
- RecyclerView和listview的比较
- RecyclerView和ListView的异同
- RecyclerView和ListView的异同
- RecyclerView和listview的区别
- 十个JDBC的最佳实践
- HDU -5618 Jam's problem again cdq分治
- python时间,时间戳的转化与处理
- 线程安全和非线程安全的理解
- 卓有成效的管理者(笔记)——序言
- RecyclerView的使用和与ListView的一些不同之处
- Swift基础语法2
- python练习(十三)
- mysql ZIP Archive与mysql MSI Installer区别 5 唐致红 | 浏览 13274 次 我有更好的答案 推荐于2016-03-22 03:47:12 最佳答案 mysql
- 从Android/Java基础之上学习C/C++语言(8)--C语言基础--预编译
- Mysql多列分组查询 示列详解
- 带权并查集--uva12232 Exclusive-OR
- KMP算法详细讲解
- hdu 1874畅通工程续 floyd