玩Android项目开发8------项目界面(RecyclerView实现瀑布流 + Glide裁剪图片)

在之前的界面中,我有使用FlexBoxLayout实现瀑布流的效果,其实在项目中引进RecyclerView的时候,我说过之后会引进瀑布流效果,那么现在就有一个功能使用了瀑布流。

1、RecyclerView实现瀑布流。

在项目页面的第二个Tab中,我就使用到了瀑布流,其实没有什么特别难的,就是一个布局管理器StaggeredGridLayoutManager,通过它就可以实现瀑布流。

if(holder instanceof ProjectViewHolder){
             //设置适配器
            proAdapter = new ProjectAdapter(context,projectList);
            //设置瀑布流管理器
            StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(3,
                    StaggeredGridLayoutManager.VERTICAL);
            ((ProjectViewHolder) holder).rv_project.setLayoutManager(manager);
            ((ProjectViewHolder) holder).rv_project.setAdapter(proAdapter);

            ((ProjectViewHolder) holder).rv_project.addItemDecoration(new RvItemDistance(RvItemDistance.px2dp(8)));
//
        }

可以按照自己的意愿,来设置列数,这里设置的是3列,然后RecyclerView设置适配器,就完成了。

在这里插入图片描述
2、点击进入项目详情页面。

当点击项目页面的每个Item时,会跳转到对应的Item界面,需要将数据传递过去,List数据的传递,记得要将Bean类实现Serializable接口。

pjAdapter.setOnItemClickListener1(new ProjectViewPagerAdapter.onItemClickListener() {
            @Override
            public void onClick(int id) {
                //获取id,根据id获取数据
                fPresenter.getProjectById(1,id);
                Intent intent = new Intent();
                intent.putExtra("data", (Serializable) datas);
                intent.setClass(getContext(),ProjectInfoActivity.class);
                startActivity(intent);
            }
        });

在Activity界面接收数据:

List<ProjectItemBean.DataBean.DatasBean> datas =
                (List<ProjectItemBean.DataBean.DatasBean>) getIntent().
                        getSerializableExtra("data");

然后使用RecyclerView实现数据的匹配绑定。

public class ProjectInfoAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private final Context context;
    private final List<ProjectItemBean.DataBean.DatasBean> datas;

    public ProjectInfoAdapter(Context context, List<ProjectItemBean.DataBean.DatasBean> datas){
        this.context = context;
        this.datas = datas;
    }
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_project_info,parent,false);
        return new ProjectViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if(holder instanceof ProjectViewHolder){
            ((ProjectViewHolder) holder).tv_project_author.setText(datas.get(position).getAuthor());
            ((ProjectViewHolder) holder).tv_project_title.setText(datas.get(position).getTitle());
            ((ProjectViewHolder) holder).tv_project_date.setText(datas.get(position).getNiceDate());
            Glide.with(context).load(datas.get(position).getEnvelopePic()).centerCrop()
                    .into(((ProjectViewHolder) holder).iv_project);
            Typeface typeface = Typeface.createFromAsset(context.getAssets(),"黑体.otf");
            ((ProjectViewHolder) holder).tv_project_title.setTypeface(typeface);
        }
    }

    @Override
    public int getItemCount() {
        return datas.size();
    }

    class ProjectViewHolder extends RecyclerView.ViewHolder{
        private ImageView iv_project,iv_project_collection;
        private TextView tv_project_title,tv_project_desc,tv_project_date,tv_project_chapter,tv_project_author;
        public ProjectViewHolder(@NonNull View itemView) {
            super(itemView);
            iv_project = itemView.findViewById(R.id.iv_project);
            tv_project_title = itemView.findViewById(R.id.tv_project_title);
            tv_project_date = itemView.findViewById(R.id.tv_project_date);
            iv_project_collection = itemView.findViewById(R.id.iv_project_collection);
            tv_project_author = itemView.findViewById(R.id.tv_project_author);
        }
    }
}

这个地方没什么好说的,之前的小节中,都说了很多了,就有一个问题,Glide裁剪图片。

Glide加载图片的时候,其实会根据ImagView的大小来裁剪图片,但是在加载到ImageView的时候,有时候尺寸并不符合,所以我们也可以自己去裁剪。

(1)居中裁剪 centerCrop

Glide.with(context).load(datas.get(position).getEnvelopePic()).centerCrop()
                    .into(((ProjectViewHolder) 

在这里插入图片描述
(2)圆角 RoundedCorners(int)

 Glide.with(context).load(datas.get(position).getEnvelopePic()).transform(new RoundedCorners(20))
                    .into(((ProjectViewHolder) holder).iv_project);

在这里插入图片描述
(3)居中 + 圆角

这种方式存在一个顺序问题,如果先圆角,再裁剪,那么圆角会被裁剪;因此需要先裁剪,再圆角。

Glide.with(context).load(datas.get(position).getEnvelopePic()).transform(new CenterCrop(),new RoundedCorners(20))
                    .into(((ProjectViewHolder) holder).iv_project);

在这里插入图片描述
(4)圆形裁剪 CircleCrop

Glide.with(context).load(datas.get(position).getEnvelopePic()).transform(new CircleCrop())
                    .into(((ProjectViewHolder) holder).iv_project);

在这里插入图片描述
3、单击Item进入项目详情页面

做接口回调。

holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onClick(datas.get(position).getLink());
            }
        });

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android RecyclerViewAndroid 开发用于显示列表和网格布局的高级组件,它提供了一种高效的方式来处理大量数据并保持良好的性能。瀑布流布局(也称为无限滚动瀑布流或 Masonry Layout)是 RecyclerView 常用的一种特殊布局模式,它的特点是元素按瀑布式向下流动,每一行根据屏幕宽度自适应地排列,形成类似瀑布的效果。 在RecyclerView实现瀑布流布局: 1. **布局管理器**:使用 GridLayoutManager 或者 StaggeredGridLayoutManager(适用于不规则布局),设置 spanSizePerRowWhenLargerThanScreen 分数,使得每一行的列数可以根据屏幕大小动态变化。 ```java GridLayoutManager layoutManager = new GridLayoutManager(context, 2, LinearLayoutManager.VERTICAL, false); layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { // 根据item的高度计算每个cell的宽度 return Math.max(1, (int) (Math.ceil(itemHeight / getResources().getDisplayMetrics().density))); } }); recyclerView.setLayoutManager(layoutManager); ``` 2. **ViewHolder**:创建一个自定义的 ViewHolder 类,负责复用和绘制每个item。 3. **加载更多**:通常使用 `onScrollListener` 或者 `ItemTouchHelper` 来监听滚动事件,并在底部加载更多的内容,确保瀑布流效果。 4. **数据源管理**:数据源需要包含高度信息,这样布局管理器才能正确计算每个item的span size。可以使用 `LinearLayoutManager` 的 `getItemDecoration()` 方法添加自定义的分隔线,同动态调整高度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Awesome_lay

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

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

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

打赏作者

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

抵扣说明:

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

余额充值