RecyclerView瀑布流
来源:互联网 发布:景泰蓝 珐琅 区别 知乎 编辑:程序博客网 时间:2024/06/03 17:11
前言
RecylerView三种布局管理器LinearLayoutManager
、GridLayoutManager
、StaggeredGridLayoutManager
对应单行列表、多行列表、瀑布流式布局,都具水平与垂直。
代码
适配器
ViewHolder
中设图宽高
package adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import com.self.zsp.rd.R;import java.util.ArrayList;import java.util.List;import entity.ImageBean;import util.DisplayUtils;import util.GlideImageLoader;/** * Created on 2017/12/18. * * @desc select photo adapter */public class ImagePickShowAdapter extends RecyclerView.Adapter<ImagePickShowAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener { private Context context; private List<ImageBean> imageBeanList; private int screenWidth; private OnRecyclerViewItemClickListener mOnItemClickListener; private OnRecyclerViewItemLongClickListener mOnItemLongClickListener; public ImagePickShowAdapter(Context context) { this.context = context; imageBeanList = new ArrayList<>(); screenWidth = DisplayUtils.getScreenWidth(context); } public void setImageData(List<ImageBean> list) { this.imageBeanList = list; getRandomHeight(list); } @Override public int getItemCount() { if (imageBeanList != null && imageBeanList.size() > 0) { return imageBeanList.size(); } return 0; } @Override public void onClick(View v) { if (mOnItemClickListener != null) { // Method getTag which get data. mOnItemClickListener.onItemClick(v, (ImageBean) v.getTag()); } } @Override public boolean onLongClick(View v) { if (mOnItemLongClickListener != null) { // Method getTag which get data. mOnItemLongClickListener.onItemLongClick(v, (ImageBean) v.getTag()); } return true; } public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.mOnItemClickListener = listener; } public void setOnItemLongClickListener(OnRecyclerViewItemLongClickListener listener) { this.mOnItemLongClickListener = listener; } public interface OnRecyclerViewItemClickListener { /** * 短点 * * @param view * @param imageBean */ void onItemClick(View view, ImageBean imageBean); } public interface OnRecyclerViewItemLongClickListener { /** * 长点 * * @param view * @param imageBean */ void onItemLongClick(View view, ImageBean imageBean); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // Get context. /*context = parent.getContext();*/ // inflate(R.layout.list_item_record,parent,false)不这么写则cardview不适宽 View view = LayoutInflater.from(context).inflate(R.layout.image_pick_show_item, parent, false); // 为所创View注册点击事件 view.setOnClickListener(this); view.setOnLongClickListener(this); return new ImagePickShowAdapter.ViewHolder(view); } @Override public void onBindViewHolder(final ViewHolder holder, int position) { final ImageBean imageBean = imageBeanList.get(position); // 数据保存在itemView之Tag中以便点时获取 holder.itemView.setTag(imageBean); GlideImageLoader.displayByUri(context, imageBean.getPath(), R.drawable.place_holder, holder.ivImageSelect); } /** * 自定义ViewHolder(持每Item界面全部元素) */ public class ViewHolder extends RecyclerView.ViewHolder { public ImageView ivImageSelect; public ViewHolder(final View view) { super(view); ivImageSelect = view.findViewById(R.id.ivImagePickShow); ViewGroup.LayoutParams params = ivImageSelect.getLayoutParams(); // 图宽高 params.width = screenWidth / 2; params.height = (int) (200 + Math.random() * 400); ivImageSelect.setLayoutParams(params); } }}
布局
<?xml version="1.0" encoding="utf-8"?><android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content" app:cardCornerRadius="@dimen/d6" app:cardElevation="@dimen/d6" app:cardMaxElevation="@dimen/d12"> <ImageView android:id="@+id/ivImagePickShow" android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" /></android.support.v7.widget.CardView>
间距
package util;import android.graphics.Rect;import android.support.v7.widget.RecyclerView;import android.view.View;/** * Created on 2017/10/23. * * @desc recyclerView item space */public class SpaceItemDecoration extends RecyclerView.ItemDecoration { private int space; public SpaceItemDecoration(int space) { this.space = space; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { outRect.left = space; outRect.top = space; outRect.right = space; outRect.bottom = space; }}
package util;import android.graphics.Rect;import android.support.v7.widget.RecyclerView;import android.view.View;/** * Created on 2017/12/21. * * @desc */public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration { private int spanCount; private int spacing; private boolean includeEdge; public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) { this.spanCount = spanCount; this.spacing = spacing; this.includeEdge = includeEdge; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { // item position int position = parent.getChildAdapterPosition(view); // item column int column = position % spanCount; if (includeEdge) { // spacing - column * ((1f / spanCount) * spacing) outRect.left = spacing - column * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing) outRect.right = (column + 1) * spacing / spanCount; if (position < spanCount) { // top edge outRect.top = spacing; } outRect.bottom = spacing; // item bottom } else { // column * ((1f / spanCount) * spacing) outRect.left = column * spacing / spanCount; // spacing - (column + 1) * ((1f / spanCount) * spacing) outRect.right = spacing - (column + 1) * spacing / spanCount; if (position >= spanCount) { // item top outRect.top = spacing; } } }}
主代码
private RecyclerView recyclerViewShow;private ImagePickShowAdapter showAdapter;RecyclerView.LayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);recyclerViewShow.setLayoutManager(layoutManager);// 每item内容不改RecyclerView大小,此设提性能recyclerViewShow.setHasFixedSize(true);recyclerViewShow.addItemDecoration(new SpaceItemDecoration(3));showAdapter = new ImagePickShowAdapter(ImagePickerActivity.this);showAdapter.setImageData(imageSelect);if (!showAdapter.hasObservers()) { recyclerViewShow.setAdapter(showAdapter);} else { showAdapter.notifyDataSetChanged();}
附
/** * 随高 * * @param list */private void getRandomHeight(List<ImageBean> list) { height = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { height.add((int) (300 + Math.random() * 400)); }}
阅读全文
0 0
- RecyclerView瀑布流
- RecyclerView实现瀑布流
- Android-RecyclerView瀑布流
- RecyclerView之瀑布流
- Android RecyclerView瀑布流
- recyclerview瀑布流
- recyclerView实现瀑布流
- RecyclerView布局+瀑布流
- RecyclerView的瀑布流
- Recyclerview 瀑布流效果
- RecyclerView瀑布流
- 【Android-RecyclerView】瀑布流实现
- 【Android-RecyclerView】瀑布流实现
- RecyclerView 实现瀑布流效果
- 7.1 RecyclerView 实现瀑布流
- Android RecyclerView实现瀑布流
- RecyclerView实现瀑布流效果
- RecyclerView彩虹瀑布流实现
- Hibernate缓存
- Java转Python之并发
- Tensorflow学习比较-多线程
- Android:控件布局(相对布局)RelativeLayout
- tomcat下各个文件作用
- RecyclerView瀑布流
- Leetcode141. Linked List Cycle
- 基于onvif协议的视频监控系统(一):需要理解的关键字
- ubuntu 默认防火墙安装、启用、查看状态
- (转载)Android酷炫实用的开源框架(UI框架)
- 求最大公约数之辗转相除法、更相减损术及两者结合算法
- 基于时延的mptcp的拥塞控制
- LTE带宽和子载波计算方式
- 如何用74HC595实现流水灯