复杂RecyclerView的实现(添加底部瀑布流效果)
来源:互联网 发布:淘宝美工作品欣赏 编辑:程序博客网 时间:2024/05/22 11:12
言归正传,我们首先来看看实现的效果:
这篇文章主要讲的是底部瀑布流的实现,如果对于上面的布局存在疑问的话,请转移我的另一篇博客:
复杂RecyclerView实现
言归正传:
看到这种效果图的第一反应便是,卧槽,这什么鬼,布局太复杂了。
这种反应很正常,因为木有从一个宏观的角度去分析问题。依据之前博客的思路,我们根据不同的ItemType进行区分不同类型的条目,然后根据Type创建不同的ViewHolder,接着再进行setData()的数据绑定。介绍这个思路是为了告诉大家,总体的思路不变,这时候,有的同学可能会问了,江老师(某田姓同学一直这么叫我,哈哈),这下面的条目难道是和之前横向布局一样,定义一个ScrollView往里面添加相应的条目吗,No,Too young,Too Simple。
下面实际上是另外一个RecyclerView,那么某田姓同学又会问了,“这里的高度是怎么做出来这种效果的,直接的布局做不出来啊?”,这里我们就要介绍一种新的布局管理器,那就是:
StaggeredGridLayoutManager 瀑布流式布局管理器(可以实现类似于GridView的表格效果):详见hongyang大神的博客:点击打开链接
嗯,理清楚了思路之后,我们来进行相关的书写吧:
1.首先我们需要定义底部瀑布流的Adapter:MyRecyclerViewChileAdapter
老步骤,就不必多说了:
首先,创建构造方法以及定义相关的属性:
//定义常用的参数 private Context ctx; private ArrayList<String> arrayList; private List<Integer> mHeights = new ArrayList<>(); public MyRecyclerViewChileAdapter(Context ctx, ArrayList<String> arrayList) { this.ctx = ctx; this.arrayList = arrayList; }
然后呢,重写几个重要的方法:
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder holder = null; holder = new ViewHolder1(View.inflate(ctx, R.layout.item4_layout, null)); return holder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ((ViewHolder1) holder).setData(position); } @Override public int getItemCount() { return arrayList.size(); }
这几个方法再不会的同学就要打屁股了,哈哈。
然后,重点来了,我们的高度差是怎么设定的呢?高度是根据返回条目中的图片高度设定的,但是这里由于没有服务,所以产生的条目高度都是我随机生成的,为了展示效果所以夸张了点儿,哈哈。
//为每种布局定义自己的ViewHolder public class ViewHolder1 extends RecyclerView.ViewHolder { private TextView home_read_title; private ImageView home_read_piv_iv; public ViewHolder1(View itemView) { super(itemView); if (mHeights.size() <= getItemCount()) { mHeights.add((int) (500 + Math.random() * 400)); } home_read_title = (TextView) itemView.findViewById(R.id.home_read_title); home_read_piv_iv = (ImageView) itemView.findViewById(R.id.home_read_piv_iv); home_read_title.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); }
随机数获取之后,我们便可以随心所欲的设置高度啦!!!
public void setData(int position) { ViewGroup.LayoutParams layoutParams = home_read_piv_iv.getLayoutParams(); if (mHeights.size() > position) layoutParams.height = mHeights.get(position); else layoutParams.height = 589; home_read_piv_iv.setLayoutParams(layoutParams); home_read_title.setText(arrayList.get(position) + "啊哈哈哈哈哈哈"); }
注意一下,这里的setData()方法是在之前打的RecyclerView中的onBindViewHolder方法中调用的,而产生随机高度的方法也就是构造方法是在onCreateViewHolder中调用的。
下面贴出来完整的Adapter的代码:
package com.marsjiang.complexrecyclerview.adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import com.marsjiang.complexrecyclerview.R;import java.util.ArrayList;import java.util.List;/** * RecyclerView的Adapter * Created by Jiang on 2017-07-17. */public class MyRecyclerViewChileAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { //定义常用的参数 private Context ctx; private ArrayList<String> arrayList; private List<Integer> mHeights = new ArrayList<>(); public MyRecyclerViewChileAdapter(Context ctx, ArrayList<String> arrayList) { this.ctx = ctx; this.arrayList = arrayList; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder holder = null; holder = new ViewHolder1(View.inflate(ctx, R.layout.item4_layout, null)); return holder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ((ViewHolder1) holder).setData(position); } @Override public int getItemCount() { return arrayList.size(); } //为每种布局定义自己的ViewHolder public class ViewHolder1 extends RecyclerView.ViewHolder { private TextView home_read_title; private ImageView home_read_piv_iv; public ViewHolder1(View itemView) { super(itemView); if (mHeights.size() <= getItemCount()) { mHeights.add((int) (500 + Math.random() * 400)); } home_read_title = (TextView) itemView.findViewById(R.id.home_read_title); home_read_piv_iv = (ImageView) itemView.findViewById(R.id.home_read_piv_iv); home_read_title.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); } public void setData(int position) { ViewGroup.LayoutParams layoutParams = home_read_piv_iv.getLayoutParams(); if (mHeights.size() > position) layoutParams.height = mHeights.get(position); else layoutParams.height = 589; home_read_piv_iv.setLayoutParams(layoutParams); home_read_title.setText(arrayList.get(position) + "啊哈哈哈哈哈哈"); } }}
好的接下来就是设定Adapter和设置布局管理器的方法了,这里参照了某个大神的写法,不好意思了,博客地址我没找到:
package com.marsjiang.complexrecyclerview.widget;import android.content.Context;import android.graphics.PointF;import android.support.v7.widget.LinearSmoothScroller;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.util.DisplayMetrics;/** * Created by Jiang on 2017/1/9. * 用于改变recycleview加载更多结束以后向上滑动一段距离是,平滑, 可以控制时间 */public class MyStaggerGrildLayoutManger extends StaggeredGridLayoutManager { private float MILLISECONDS_PER_INCH = 1f; private Context contxt; public MyStaggerGrildLayoutManger(Context context, int spanCount, int orientation) { super(spanCount, orientation); } @Override public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) { @Override public PointF computeScrollVectorForPosition(int targetPosition) {// return MyStaggerGrildLayoutManger.this.computeScrollVectorForPosition(targetPosition); return null; } //This returns the milliseconds it takes to //scroll one pixel. @Override protected float calculateSpeedPerPixel (DisplayMetrics displayMetrics) { return MILLISECONDS_PER_INCH / displayMetrics.density; //返回滑动一个pixel需要多少毫秒 } }; linearSmoothScroller.setTargetPosition(position); startSmoothScroll(linearSmoothScroller); } public void setSpeedSlow() { //自己在这里用density去乘,希望不同分辨率设备上滑动速度相同 //0.3f是自己估摸的一个值,可以根据不同需求自己修改 MILLISECONDS_PER_INCH = contxt.getResources().getDisplayMetrics().density * 0.3f; } public void setSpeedFast() { MILLISECONDS_PER_INCH = contxt.getResources().getDisplayMetrics().density * 0.03f; }}
打完,收工,跑一跑,惊喜不断,哈哈,这样可比之前addHeader以及addFooter实现复杂条目布局来的方便的多了。嗯,就到这里,有点儿困了!
技术在于分享与提升,哈哈,代码地址: 点击打开链接 欢迎Star
- 复杂RecyclerView的实现(添加底部瀑布流效果)
- RecyclerView实现瀑布流的效果
- RecyclerView实现瀑布流效果(二)
- RecyclerView 实现瀑布流效果
- RecyclerView实现瀑布流效果
- RecyclerView的简单使用以及实现瀑布流效果
- 5.使用RecyclerView优雅的实现瀑布流效果
- RecyclerView介绍(四)----实现瀑布流效果
- Android开发之实现瀑布流效果(RecyclerView)
- RecyclerView--实现 ListView,GridView,瀑布流 效果
- 利用RecyclerView实现瀑布流效果
- Android RecyclerView 实现瀑布流效果
- RecyclerView轻松实现瀑布流效果
- 使用RecyclerView实现瀑布流效果
- Recyclerview 瀑布流效果
- RecyclerView的简单瀑布流效果
- 使用RecyclerView展示瀑布流的效果
- RecyclerView的Item点击事件,增加删除Item瀑布流动画效果,长按拖动Item,RecyclerView复杂布局、实现新闻频道选择器
- sql 基础知识
- Python中的的函数的参数传递
- 把字符串转换成整数
- [知了堂学习笔记]_纯JS制作《飞机大战》游戏_第2讲(对象的实现及全局变量的定义)
- Android文件目录res和assets的区别
- 复杂RecyclerView的实现(添加底部瀑布流效果)
- 等车问题
- 洛谷 2024 食物链
- 20170824
- 【23种设计模式】行为型模式 > 策略模式
- 【JZOJ5295】【清华集训模拟】Create(主席树)
- Ubuntu16.04 开发环境的安装和设置
- [算法]最长子数组问题
- 斯坦福大学CS224d基础1:线性代数回顾