Android Studio开发——使用RecyclerView实现图片瀑布流+分割线
文章目录
任务描述:
- 在上次微信首页的基础上,选择一个Fragment实现RecyclerView控件的设计开发,内容不限。
- 我选择在“设置”界面中使用RecyclerView实现图片瀑布流及分割线的展示
扩展:RecyclerView的优点
- RecyclerView封装了viewholder的回收复用,也就是说RecyclerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的逻辑被封装了,写起来更加简单。
- 直接省去了listview中convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。
- 提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。
- 设置布局管理器以控制Item的布局方式,横向、竖向以及瀑布流方式
例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还StaggeredGridLayoutManager等)。也就是说RecyclerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。- 可设置Item的间隔样式(可绘制)
通过继承RecyclerView的ItemDecoration这个类,然后针对自己的业务需求去书写代码。- 可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecyclerView有其自己默认的实现。
一、基本过程
1. 引入依赖
implementation 'com.android.support:recyclerview-v7:28.0.0'
==这里注意Android Support库和AndroidX不兼容 ==
解决方法
2. 布局中添加RecyclerView
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
3.item布局(我这里只放置了一个ImageView控件)
<?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:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingBottom="5dp"
android:paddingRight="5dp"
android:background="#E1FFFF">
<ImageView
android:id="@+id/item_img"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:gravity="center"
tools:text="item"/>
</LinearLayout>
android:adjustViewBounds="true"
调整ImageView的界限来保持图像纵横比不变。
我原本的目的是为了使图片高度自适应,算是基本实现了,但是一拖动布局就混乱了(后文会放效果图),望指正。
4. Adapter适配器设置
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
private List<Img> ImgList;
private Context context;
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView Image;
public ViewHolder(View view) {
super(view);
Image = (ImageView) view.findViewById(R.id.item_img);
// fruitName = (TextView) view.findViewById(R.id.fruitname);
}
}
public RecyclerViewAdapter(List<Img> List) {
ImgList = List;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.itme, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final Img img = ImgList.get(position);
holder.Image.setImageResource(img.getImageId());
}
5. 在Fragment中初始化RecyclerView
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view= inflater.inflate(R.layout.tab04, container, false);
InitImg();
RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(manager);
RecyclerViewAdapter adapter = new RecyclerViewAdapter(ImgList);
recyclerView.setAdapter(adapter);
recyclerView.addItemDecoration(new DividerItemDecoration(
getActivity(), DividerItemDecoration.BOTH_SET,5,255));
return view;
}
private List<Img> ImgList = new ArrayList<>();
private void InitImg(){
for (int i