使用RecyclerView实现瀑布流的效果
主函数:
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private List<String> dataList = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到控件
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
//初始化数据
initData();
//设置瀑布流的布局方式,参数一:3列 参数二:垂直方向
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
//为recyclerView设置布局管理器
recyclerView.setLayoutManager(staggeredGridLayoutManager);
//创建适配器
final MyRecyclerViewAdapter myRecyclerViewAdapter =new MyRecyclerViewAdapter(this,dataList);
//设置适配器
recyclerView.setAdapter(myRecyclerViewAdapter);
//自定义监听
myRecyclerViewAdapter.setOnItemCickListener(new MyRecyclerViewAdapter.MyOnItemClickListener() {
@Override
public void myOnItemClickListener(int position, View view) {
Toast.makeText(MainActivity.this, "点击了第"+position+"条", Toast.LENGTH_SHORT).show();
myRecyclerViewAdapter.deleteData(position);
}
});
myRecyclerViewAdapter.setOnLongCickListener(new MyRecyclerViewAdapter.MyOnLongClickListener() {
@Override
public void myOnLongClickListener(int position, View view) {
myRecyclerViewAdapter.addData(position,"我是新来的");
}
});
}
private void initData() {
for (int i = 0; i < 30; i++) {
dataList.add(i+"");
}
}
}
MyRecycleViewAdapter:
package fanggao.qf.recyclerstaggredgridview01; 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.TextView; import java.util.ArrayList;
import java.util.List;
import java.util.Random; /**
* Created by Administrator on 2016/9/28.
*/
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
private Context context;
private List<String> dataList ;
private int random;
private List<Integer>heightList = new ArrayList<Integer>();
private MyOnItemClickListener myOnItemClcikListener;
private MyOnLongClickListener myOnLongClickListener; public MyRecyclerViewAdapter(Context context, List<String> dataList) {
this.context = context;
this.dataList = dataList;
//初始化高度
if(dataList != null&&dataList.size() != 0){
for (int i = 0; i < dataList.size(); i++) {
random = new Random().nextInt(200)+100;//[100,300)
heightList.add(random);
}
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//加载布局
View inflate = LayoutInflater.from(context).inflate(R.layout.recyclerview_item, parent,false);
//将布局传入viewholder并返回给onBindViewHolder
return new MyViewHolder(inflate);
} /**
* 该方法类似与listview中的getView方法,每次加载视图的时候都会调用,但是这里给了每个item随机的高度,因此当屏幕复用时,
* 会不断复用不同的高度,当屏幕滑到顶部时,会因为高度不等产生大片空白,然后回到初始状态,因此,需要给每个item记录高度,
* 将其存到集合,每次调用该item时,设置高度
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
holder.text.setText(dataList.get(position));
//设置高度
int height = heightList.get(position);
//得到控件的高度
ViewGroup.LayoutParams layoutParams = holder.text.getLayoutParams();
//设置高度
layoutParams.height = height;
//设置点击事件
if(myOnItemClcikListener != null && !holder.text.hasOnClickListeners()){
holder.text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//回调方法,,将view控件和索引传回,索引必须是布局在父布局中的索引,否则索引错乱最终报错
myOnItemClcikListener.myOnItemClickListener(holder.getLayoutPosition(),v);
}
});
}
if(myOnLongClickListener != null ){
holder.text.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
myOnLongClickListener.myOnLongClickListener(holder.getLayoutPosition(),v);
return true;
}
});
} }
@Override
public int getItemCount() {
return dataList.size();
} public void deleteData(int position) {
//使用notifyItemInserted/notifyItemRemoved会有动画效果
// 而使用notifyDataSetChanged()则没有
heightList.remove(position);
dataList.remove(position);
notifyItemRemoved(position);
}
public void addData(int position,String str){
dataList.add(position,str);
int random = new Random().nextInt(200)+100;
heightList.add(position,random);
notifyItemInserted(position);
} //注意:该类是公共的,不然适配器设置设置泛型失败
public class MyViewHolder extends RecyclerView.ViewHolder{
private TextView text;
public MyViewHolder(View itemView) {
super(itemView);
text = (TextView) itemView.findViewById(R.id.tv_text);
}
}
//对外暴露的方法,当设置该方法时,会创建接口的实现类
public void setOnItemCickListener(MyOnItemClickListener myOnItemClickListener){
this.myOnItemClcikListener = myOnItemClickListener;
}
public void setOnLongCickListener(MyOnLongClickListener myOnLongClickListener){
this.myOnLongClickListener = myOnLongClickListener;
}
//自定义点击接口
public interface MyOnItemClickListener{
void myOnItemClickListener(int position,View view);
}
//自定义长按接口
public interface MyOnLongClickListener{
void myOnLongClickListener(int position,View view);
}
}
效
果:

使用RecyclerView实现瀑布流的效果的更多相关文章
- android实现超酷的腾讯视频首页和垂直水平网格瀑布流一揽子效果
代码地址如下:http://www.demodashi.com/demo/13381.html 先来一波demo截图 实现ListView.GridView.瀑布流 1.导入RecyclerView的 ...
- Android RecyclerView(瀑布流)水平/垂直方向分割线
Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...
- [Android Pro] RecyclerView实现瀑布流效果(二)
referece to : http://blog.csdn.net/u010687392 在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutMa ...
- RecyclerView实现瀑布流效果(图文详解+源码奉送)
最近有时间研究了一下RecyclerView,果然功能强大啊,能实现的效果还是比较多的,那么今天给大家介绍一个用RecyclerView实现的瀑布流效果. 先来一张效果图: 看看怎么实现吧: 整体工程 ...
- RecyclerView实现瀑布流效果(二)
在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutManager.GridLayoutManager.StaggeredGridLayoutMan ...
- Android-Recyclerview-GridView&瀑布流等效果
由于Recyclerview是在 android.support.v7.widget.包 RecyclerView,所以需要导Recycler库: 导Recycler库: 选择项目,右键--> ...
- 初步使用RecyclerView实现瀑布流
先看效果 关于RecyclerView,真的是很强大. 个人觉得主要方便的地方是 1.直接可以设置条目布局,通过setLayoutManager LinearLayoutManager:线性布局,横向 ...
- RecyclerView 制作瀑布流图片
这是瀑布流的效果图 RecyclerView(ListView的升级版) 加载图片用的是第三方图片加载框架 ------------------------------------- 在Xml中 &l ...
- 玩转Masonry JS库来实现瀑布流Web效果
工作项目中需要制作个Mobile上的Web App的展示,方便快捷访问和评价反馈.在展示页面能看到应用展示图,点击进入Web应用.我不是前端开发者,对HTML, CSS, JS这三剑客仅仅是略知一二. ...
随机推荐
- C# using SendMessage, problem with WM_COPYDATA z
The final missing piece depends on if you are using any processor, x86 or x64. The details using the ...
- Magento输入正确的登陆名和密码无法进入后台
请找到 这个文件夹: app\code\core\Mage\Core\Model\Session\Abstract 然后修改Varien.php这个文件: 找到代码(大约88行): $cookiePa ...
- 项目用到了lua的哪些部分
昨天有位同事跟我说,我们的手游客户端(cocos2d-x lua binding)代码没有看到lua的特殊技巧,用起来跟其他语言差不多.<Programming in lua>毕竟有将近4 ...
- Mysql的函数使用方法
今天有点临时需求要计算一张表的结果,不想写代码,想到了mysql的自定义函数.碰到了很多问题,为了方便一下使用,在此记录一下. 需求:一张表中,有比分,需要查询出比赛id和比赛结果. 分析: ...
- ubuntu 的 apt-get update 出现404错误时,ubuntu 版本也 end of life 了的解决方案
xmodulo.com/how-to-fix-apt-get-update-error-on-ubuntu.html 如果是依赖没找到,可以用 sudo apt-get install -f 先补齐依 ...
- 科大讯飞和Tizen-TTS语音合成引擎
最近在做一个文本转语音TTS(Text to Speech)的第三方软件封装,使用的是国内语音技术龙头安徽科大讯飞公司提供的离线引擎AiSound5.0,主要用于汽车导航用途.科大讯飞还提供 了AiT ...
- 远程控制篇:在DELPHI程序中拨号上网
用MODEM拨号上网,仍是大多数个人网民选择上网的方式.如果能在我们的应用程序中启动拨号连接(如IE浏览器程序中的自动拨号功能),无疑将会方便我们的软件用户(不用再切换应用程序,运行拨号网络),提高我 ...
- A Tour of Go Exercise: HTTP Handlers
Implement the following types and define ServeHTTP methods on them. Register them to handle specific ...
- MSSQLSERVER数据库- 作业调度定时备份数据库
作业调度和备份数据库是常见的行为,掌握这两项技术我觉的非常有必要. 在网上找到这个示例,记录在这里 备份数据库的SQL语句 --自动备份并保存最近5天的SQL数据库作业脚本 ) DECLARE @da ...
- [一位菜鸟的COCOS-2D编程之路]精灵表单的制作以及简易动画的生成
1.第一步:使用Zwoptex 制作精灵表单 2.制作的表单的名称为 cocos2Dpng,cocos2D.plist: 3.精灵的动画效果 主要分为五部分. // on "init&quo ...