RecyclerView瀑布流

前言

RecylerView三种布局管理器LinearLayoutManagerGridLayoutManagerStaggeredGridLayoutManager对应单行列表、多行列表、瀑布流式布局,都具水平与垂直。

代码

适配器

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));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

snpmyn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值