文章标题
来源:互联网 发布:审美疲劳 知乎 编辑:程序博客网 时间:2024/05/16 11:25
小白学习笔记—->RecyclerView实现瀑布流效果
RecyclerView是5出来的控件,可以通过导入support-v7对其进行使用。 本次来讲通过RecyclerView实现瀑布流效果,先看效果图↓
它封装了viewholder的回收复用。RecyclerView使用布局管理器管理子view的位置,也就是说你再不用拘泥于ListView的线性展示方式,方便做出各种通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现动态浏览的效果。
1.RecyclerView本身提供了三个LayoutManager的实现
LinearLayoutManager
GridLayoutManager
StaggeredGridLayoutManager
2.ItemDecoration来设置item间隔,自己可重写
3.ItemAnimator来设置添加或者删除动画效果,自带的有,同时你可以自己写或者用别人的。
4.各种监听器没有提供,想要使用需要自己来写
个人了解有限,就先介绍这么多,接下来让我们来实现瀑布流效果吧
先看一下布局文件,简单导入,无需过多属性,超级简单,核心代码↓
<android.support.v7.widget.RecyclerView android:id="@+id/id_recyclerview" android:layout_width="match_parent" android:layout_height="match_parent" />
RecyclerView本身跟listview等非常相似,也需要item布局,adapter来加载数据,最终在主布局上显示RecyclerView呈现数据。来看一下item布局文件核心代码↓
<!-- 这里根据业务需求我给定一个ImageView和一个TextView --> <ImageView android:id="@+id/item_img" android:layout_width="match_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="centerCrop"/> <TextView android:id="@+id/item_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center"/>
布局文件这就算写完了,下面开始写代码部分。
//获得recyclerView mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview); //构建adapter mStaggeredHomeAdapter = new StaggeredHomeAdapter(this, mDatas); //获得LayoutManager //StaggeredGridLayoutManager通过这个来实现瀑布流的效果,同时可以设置几列显示和显示方式 mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)); //关联adapter mRecyclerView.setAdapter(mStaggeredHomeAdapter);
数据,我使用一个实体类封装对象,添加到集合,下面来写adapter核心代码↓
/** * 1.需要来继承 RecyclerView.Adapter<StaggeredHomeAdapter.MyViewHolder>ps:泛型自己定义 * 2.集成后重写三个方法 ps:参数下面看详细,排序不代表运行顺序 * getItemCount() 获得数目 * onBindViewHolder() 这个方法里我去获得item控件,同时加监听器,长按删除,点击方法图片 * onCreateViewHolder() 给定布局构建viewholder返回viewholder对象 * 3.viewholder这里我自己写了一个内部类继承ViewHolder * */public class StaggeredHomeAdapter extends RecyclerView.Adapter<StaggeredHomeAdapter.MyViewHolder>{ private LayoutInflater mInflater; private List<Integer> mHeights; //存储图片高度 private List<Pic> mDatas; /**构造方法*/ public StaggeredHomeAdapter(Context context, List<Pic> datas){ mInflater = LayoutInflater.from(context); mDatas = datas; mHeights = new ArrayList<Integer>(); for (int i = 0; i < mDatas.size(); i++){ mHeights.add( (int) (100 + Math.random() * 300)); } } //一个内部类 view持有者 class MyViewHolder extends ViewHolder{ TextView tv; ImageView iv; public MyViewHolder(View view){ super(view); tv = (TextView) view.findViewById(R.id.item_title); iv=(ImageView) view.findViewById(R.id.item_img); } } /**自己写一个接口,实现监听功能 * 有两个方法,一个点击事件监听器,一个长按事件监听*/ public interface OnItemClickLitener{ void onItemClick(View view, int position); void onItemLongClick(View view, int position); } private OnItemClickLitener mOnItemClickLitener; public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener){ this.mOnItemClickLitener = mOnItemClickLitener; } /**继承后重写方法1*/ @Override public int getItemCount() { return mDatas.size(); } /**继承后重写方法2*/ @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { holder.tv.setText(mDatas.get(position).getTitle()); holder.iv.setImageResource(mDatas.get(position).getImg()); { holder.itemView.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ int pos = holder.getLayoutPosition(); mOnItemClickLitener.onItemClick(holder.itemView, pos); } }); holder.itemView.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { int pos = holder.getLayoutPosition(); mOnItemClickLitener.onItemLongClick(holder.itemView, pos); removeData(pos); return false; } }); } } /**继承后重写方法3*/ @Override public MyViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) { MyViewHolder holder = new MyViewHolder(mInflater.inflate( R.layout.item_home, arg0, false)); return holder; } public void removeData(int position){ mDatas.remove(position); notifyItemRemoved(position); }}
监听自己写,同时写一个新的Activity,用来相应点击事件,全屏展示高清大图,用intent意图传递实体类对象实现ps:小白简单能想到这么实现可以点击图片放大,再点缩小,勿喷。
public class Gaoqing extends Activity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gaoqing); Intent intent=getIntent(); int a=intent.getIntExtra("position", R.id.icon); iv=(ImageView) findViewById(R.id.imageView1); iv.setImageResource(a); iv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); }}
item间距可以自己来设置,写了一个单独类,来处理,核心代码↓
public class SpacesItemDecoration extends RecyclerView.ItemDecoration{ private int space; public SpacesItemDecoration(int space) { this.space=space; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { outRect.left=space; outRect.right=space; outRect.bottom=space; if(parent.getChildAdapterPosition(view)==0){ outRect.top=space; } }}
同时需要在mainActivity类里定义一下
SpacesItemDecoration decoration=new SpacesItemDecoration(16); mRecyclerView.addItemDecoration(decoration);
到这里我们就已经通过RecycleView来实现了瀑布流效果,而且列数和item间隔修改超级简单,后期你们也可以去学习另外的两个官方给定的LinearLayoutManager和GridLayoutManager同样可以轻松实现listView等各种功能,并且切换形式超级方便。
小白学习笔记到此结束,有问题欢迎指正,大牛勿喷~~~
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 学习Python语言---高级数据类型
- Linux命令行学习之路(四)
- 网上商城SSH各个类间的关系(一)
- 重构——退卡——触发器试验
- CGContext 总结二
- 文章标题
- java的成员变量和局部变量!
- 『Python』序列学习总结之三——字符串
- iOS-cell.selectedBackgroundView自定义
- Android UncaughtExceptionHandler进行全局异常捕获
- 印光大师:绮语者,说风流邪僻之话,令人心念淫荡。无知少年听久,必至邪淫以丧人格,或手淫以戕身命
- HDU——1106排序(istringstream的使用、STLvector练习)
- 框架编写之聊天框架认识(一)
- NSDate计算时间差