初步使用RecyclerView实现瀑布流
先看效果

关于RecyclerView,真的是很强大。
个人觉得主要方便的地方是
1.直接可以设置条目布局,通过setLayoutManager
- LinearLayoutManager:线性布局,横向或者纵向滑动列表
- GridLayoutManager:表格布局
- StaggeredGridLayoutManager:流式布局,例如瀑布流效果
2.可以直接设置分割线 addItemDecoration方法
3.直接设置添加删除item动画 setItemAnimator方法
4.对View的复用性好 (这个是别人总结的,我还没看源码)
5.对于分割线,和增删动画,github上开源的类很多
下面看看怎么用法
一 导入包,v7的recyclerview包
二 布局
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.myrecyclerview.MainActivity" > <android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview_vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </RelativeLayout>
item布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="#8A2BE2"
android:layout_margin="3dp"
android:layout_height="wrap_content" > <TextView
android:id="@+id/id_num"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="1" />
</FrameLayout>
三,创建Adapter
package com.example.myrecycleviewdemo; import java.util.ArrayList;
import java.util.List; import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView; public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
Context mcontext;
List<String> mlist;
List<Integer> mheight;
public MyAdapter(Context context, List<String> list) {
mcontext=context;
mlist=list;
//随机高度集合
mheight=new ArrayList<Integer>();
for(int i=0;i<mlist.size();i++){
mheight.add((int)(100+Math.random()*300));
}
} @Override
public int getItemCount() { return mlist.size();
} //找到布局中空间位置
class MyViewHolder extends RecyclerView.ViewHolder{
TextView tv;
public MyViewHolder(View arg0) {
super(arg0); tv=(TextView) arg0.findViewById(R.id.id_num);
} } //绑定,渲染数据到view中
@Override
public void onBindViewHolder(MyViewHolder holder, int arg1) { LayoutParams lp=holder.tv.getLayoutParams();
lp.height=mheight.get(arg1);
holder.tv.setLayoutParams(lp);
holder.tv.setText(mlist.get(arg1)); } //先执行onCreateViewHolder
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int arg1) { MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
mcontext).inflate(R.layout.item, parent,
false));
return holder;
} public void add(int pos) { mlist.add(pos, "insert");
mheight.add((int)(100+Math.random()*300));
notifyItemInserted(pos);
} public void del(int pos) { mlist.remove(pos);
notifyItemRemoved(pos);
} }
这里的Adapter需要继承RecyclerView.Adapter,需要实现3个方法:
- onCreateViewHolder()
- onBindViewHolder()
- getItemCount()
最后,MainActivity
package com.example.myrecycleviewdemo; import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.Menu;
import android.view.MenuItem; public class MainActivity extends Activity {
RecyclerView recyclerView;
List<String> mlist;
MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData(); initview(); }
private void initview() {
recyclerView=(RecyclerView) findViewById(R.id.recyclerview_vertical);
adapter=new MyAdapter(this,mlist);
//设置动画
recyclerView.setItemAnimator(new DefaultItemAnimator());
//设置分割线
//recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
//recyclerView.setLayoutManager(new LinearLayoutManager(this));
//设置布局
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL));
recyclerView.setAdapter(adapter);
}
private void initData() {
mlist=new ArrayList<String>();
for(int i=0;i<50;i++){
mlist.add("number"+i);
} } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml. switch (item.getItemId())
{
case R.id.add:
adapter.add(1);
break;
case R.id.del:
adapter.del(1);
break;
} return true;
}
}
更换布局,分割线,动画的方式很简单,直接通过方法让不同的类当参数。
初步使用RecyclerView实现瀑布流的更多相关文章
- Android RecyclerView(瀑布流)水平/垂直方向分割线
Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...
- RecyclerView 制作瀑布流图片
这是瀑布流的效果图 RecyclerView(ListView的升级版) 加载图片用的是第三方图片加载框架 ------------------------------------- 在Xml中 &l ...
- [Android Pro] RecyclerView实现瀑布流效果(二)
referece to : http://blog.csdn.net/u010687392 在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutMa ...
- 使用RecyclerView实现瀑布流的效果
主函数: public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; privat ...
- RecyclerView实现瀑布流效果(图文详解+源码奉送)
最近有时间研究了一下RecyclerView,果然功能强大啊,能实现的效果还是比较多的,那么今天给大家介绍一个用RecyclerView实现的瀑布流效果. 先来一张效果图: 看看怎么实现吧: 整体工程 ...
- RecyclerView实现瀑布流效果(二)
在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutManager.GridLayoutManager.StaggeredGridLayoutMan ...
- 用RecyclerView实现瀑布流
首先建立一个 PbRecyclerViewActivity.java文件: 1 public class PbRecyclerViewActivity extends AppCompatActivit ...
- 基于RecyclerView的瀑布流实现
fragment的布局: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...
- RecyclerView实例-实现可下拉刷新上拉加载更多并可切换线性流和瀑布流模式(1)
摘要 最近项目有个列表页需要实现线性列表和瀑布流展示的切换,首先我想到的就是上 [RecyclerView],他本身已经很好的提供了三种布局方式,只是简单做个切换应该是很简单的事情,如果要用Recyc ...
随机推荐
- Log4j2打印一行日志时返回本行日志的字符串
import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.impl.Log4jLogEvent; impo ...
- 试图切换控制addChildViewController、_transitionFromViewController
试图切换能够用transitionFromViewController. 步骤: View Controller中能够加入多个sub view,在须要的时候显示出来: 能够通过viewControll ...
- iOS多线程与网络开发之多线程GCD
郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主.捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...
- CIKM 2013 Paper Modeling interaction features for debate side clustering
中文简单介绍:本文对怎样对网上论坛讨论中用户交互关系进行统计建模分析进行了研究. 论文出处:CIKM'13. 英文摘要: Online discussion forums are popular so ...
- 千千万万的IT开发project师路在何方
已经找不到该文章的最初出处了,有找到的人请告诉我.谢谢~~ 千千万万的IT开发project师路在何方 2007-06-25 21:41 恭喜,你选择开发project师作为自已的职业! 悲哀.你选择 ...
- hdoj-1164-Eddy's research I【分解质因数】
Eddy's research I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- Xcode加入应用图标以及启动界面
寻找了许久的资料,记录下Xcode加入应用图标以及启动界面的学习笔记: 很实用的网址: 1.(苹果官网)Designing for iOS 2.iOS 8 人机交互指南 图标和图片的尺寸參考: 更加具 ...
- 124.C++输出小结
#include <iostream> #include <iomanip> using namespace std; void main() { ////调用cout的成员函 ...
- 解决The requested resource is not available的办法
1.问题描述: eclipse中使用tomcat来运行HelloWorld时出现The requested resource is not available. 在报错中有一行Setting prop ...
- OpenSUSE下支持托盘的邮件客户端Sylpheed
在网上搜索了很多客户端想支持系统托盘,发现一个很不错的邮件客户端Sylpheed.设置方式和foxmail很像,最为重要的是支持系统托盘,很方便,默认没有开启,简单设置下:配置->通用首选项-& ...