引述
RecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。其可以实现数据纵向滚动,也可以实现横向滚动(ListView做不到横向滚动)。接下来讲解RecyclerView的用法。
第一次实验通过Android开发中的fragment实现了简易微信界面,而这一次则是在其基础上在fragment中进行RecyclerView的布局,并将RecyclerView设置为纵向布局和瀑布流的形式进行不同的页面布局展示。
RecyclerView 用法
因为RecyclerView属于新增的控件,Android将RecyclerView定义在support库里。若要使用RecyclerView,第一步是要在build.gradle中添加对应的依赖库。这里使用的依赖库为:
implementation 'androidx.recyclerview:recyclerview:1.1.0'
布局文件中调用RecyclerView布局的代码为:
<androidx.recyclerview.widget.RecyclerView />
纵向布局形式
实现功能:
- 上下拖动
- 点击变色
- 点击相应的菜单栏出现一个View 视图提示信息
项目代码
此次实验在上一次的实验中已经搭好了大致的框架,其中Fragment控件可以相当于一个小型的activity来写,因此这次的实验代码就对上一次实验中Fragment的java类进行改动就可以了。
在Fragment页面插入用于纵向布局栏的数据:
新建一个DragAdapter继承于 RecyclerView.Adapter
先给recyclerView进行传值;然后重写View的onCreateViewHolder方法调入拖拽布局文件drag_item.xml
然后要进行页面的拖拽,需要传入菜单栏的位置信息。我就重写了onBindViewHolder获取菜单栏的信息。
其中回车分隔的倒数三行代码是先接收菜单栏的内容并进行输出View视图提示信息内容输出的代码,我用了toast的方法对内容进行输出。
这行代码是拖拽后的运算代码。菜单栏移动后的下面的菜单栏位置都改变了,因此要对之后菜单栏位置进行改变,而变换后的菜单栏又要插入到一个改变后的位置
最后将列表的代码填入到布局文件的菜单栏中。代码为:
ItemTouchHelperListener java函数是对点击的布局栏位置进行监听,返回其起始位置。
这就是它的adapter代码。但是要实现拖拽操作,还要新建一个DragItemTouchHelper对具体的拖曳操作进行具体的定义。而具体的代码我主要参考了其他人的代码,因为这都是一个固定的模板可以直接使用。
参考模板:RecyclerView 使用方法总结
之后是将fragment布局文件做修改,这里要注意几个细节:fragment要在activity中使用要创建一个view视图,要使用recyclerview,需要将view强转为recyclerview才行;之后就是设定其布局、adapter等。 具体代码可以到我的代码仓库进行查看。
瀑布流
recyclerview的布局文件格式都大致相同,都先用recyclerview.widget.RecyclerView创建一个布局,然后再写一个布局文件里面放一个ImageView用于图片的引入即可。有以上两个layout文件后,基本recyclerview的xml文件就已经完成。
首先先写一个adapter,为recyclerview增加一个适配器,继承于RecyclerView.Adapter,并要使用viewholder。
首先重写onCreateViewHolder函数将ItemView渲染进来,创建ViewHolde
onBindViewHolder函数用来传入图片的信息、getItemCount用来传入图片的大小,myviewholder则是将图片的信息传入到布局文件进行输出。其主要代码就是这几个了:
为了方便,我将图片的信息都存到了一个类里,方便函数的调用。
瀑布流主要是为了实现不同大小图片的不规则插空排列。我们可以将配置代码直接写到fragment里面,其中我使用了StaggeredGridLayoutManager来进行瀑布流形式的布局。其中的StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);中的2是指每一行所显示的item数量,若图片太大,布局会自动将图片切分成多张图片进行布局放置。
要美观还可以使用CardView 同样是5.0新出的控件 实现圆角效果,省去了自己写Drawble,这个可要可不要。(为图方便这次实验并没有写)
具体代码可以看我的私人仓库。类微信界面 contactFragment是瀑布流的fragment布局代码,Adapter是瀑布流适配器代码。 frdFragment是纵向布局的fragment布局代码,DragAdapter是纵向布局适配器代码。