RecyclerView实现瀑布流

来源:互联网 发布:滨州行知中学官网 编辑:程序博客网 时间:2024/05/01 05:44

我们在使用RecyclerView时,更多的是通过网络请求得到数据,比如在加载图片或者列表项时,我们往往需要判断当前屏幕上显示的第一个item的postion是多少,最后一个item的postion是多少,当前屏幕共显示了几个item项,如果使用ListView或者GridView来判断当然好判断,只要实现AbsListView.OnScrollListener这个接口就可以得到,那么在RecyclerView中如何得到呢?RecyclerView中只提供了一个滚动监听器addOnScrollListener,并且不能实现AbsListView.OnScrollListener这个接口,那怎么获取呢?就是通过RecyclerView中的LayoutManager,我们使用RecyclerView时候都必须设置一个LayoutManager布局管理器,通过它我们可以轻松的得到当前屏幕共有几个item,第一个item的postion等数据,即:

[java] view plain copy
 print?
  1. int firstIndex = mLayoutManager.findFirstVisibleItemPosition();//返回当前屏幕第一个显示的item的postion  
  2. int firstComIndex = mLayoutManager.findFirstCompletelyVisibleItemPosition();//返回当前屏幕第一个完全显示的item的postion  
  3. int lastIndex = mLayoutManager.findLastVisibleItemPosition();//返回当前屏幕最后一个显示的item的position  
  4. int lastComIndex = mLayoutManager.findLastCompletelyVisibleItemPosition();//返回当前屏幕最后一个完全显示的item的posion  
  5. View view = mLayoutManager.findViewByPosition(int postion);//返回对应postion的itemView  


RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager。其中StaggeredGridLayoutManager可实现交错式网格布局,正好可以用来实现瀑布流。

下面先看看效果图吧,再贴代码:



其中大部分内容实现其实是和上篇文章是一样的,就不多叙述了,就一个地方不同,就是我们在适配器中绑定ViewHolder的方法中需要重新给我们的itemView布局设置height,我这里是生成随机数来设置高度的,代码实现为:

[java] view plain copy
 print?
  1. private void getRandomHeight(List<String> lists){//得到随机item的高度  
  2.        heights = new ArrayList<>();  
  3.        for (int i = 0; i < lists.size(); i++) {  
  4.            heights.add((int)(200+Math.random()*400));  
  5.        }  
  6.    }  
在onBindViewHolder方法中:

[java] view plain copy
 print?
  1. ViewGroup.LayoutParams params =  holder.itemView.getLayoutParams();//得到item的LayoutParams布局参数  
  2.  params.height = heights.get(position);//把随机的高度赋予itemView布局  
  3.  holder.itemView.setLayoutParams(params);//把params设置给itemView布局  
从而实现瀑布流效果。

贴一下代码吧:

MainActivity.java

[java] view plain copy
 print?
  1. public class MainActivity extends AppCompatActivity {  
  2.     private RecyclerView mRecyclerView;  
  3.     private List<String> lists;  
  4.     private MyRecyclerAdapter adapter;  
  5.   
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_main);  
  10.         initData();  
  11.         mRecyclerView = (RecyclerView) this.findViewById(R.id.recyclerView);  
  12.         mRecyclerView.setItemAnimator(new DefaultItemAnimator());  
  13. //        mRecyclerView.addItemDecoration();//设置分割线  
  14.         mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));//设置RecyclerView布局管理器为2列垂直排布  
  15.        adapter = new MyRecyclerAdapter(this,lists);  
  16.         mRecyclerView.setAdapter(adapter);  
  17.         adapter.setOnClickListener(new MyRecyclerAdapter.OnItemClickListener() {  
  18.             @Override  
  19.             public void ItemClickListener(View view, int postion) {  
  20.                 Toast.makeText(MainActivity.this,"点击了:"+postion,Toast.LENGTH_SHORT).show();  
  21.             }  
  22.             @Override  
  23.             public void ItemLongClickListener(View view, int postion) {  
  24.                 //长按删除  
  25.                 lists.remove(postion);  
  26.                 adapter.notifyItemRemoved(postion);  
  27.             }  
  28.         });  
  29.     }  
  30.   
  31.     private void initData() {  
  32.         lists = new ArrayList();  
  33.         for (int i = 0; i < 100; i++) {  
  34.             lists.add("" + i);  
  35.         }  
  36.     }  
  37.   
  38. }  

MyRecyclerAdapter.java

[java] view plain copy
 print?
  1. public class MyRecyclerAdapter extends RecyclerView.Adapter<MyViewHolder> {  
  2.     private List<String> lists;  
  3.     private Context context;  
  4.     private List<Integer> heights;  
  5.     private OnItemClickListener mListener;  
  6.     public MyRecyclerAdapter(Context context,List<String> lists) {  
  7.         this.context = context;  
  8.         this.lists = lists;  
  9.         getRandomHeight(this.lists);  
  10.     }  
  11.     private void getRandomHeight(List<String> lists){//得到随机item的高度  
  12.         heights = new ArrayList<>();  
  13.         for (int i = 0; i < lists.size(); i++) {  
  14.             heights.add((int)(200+Math.random()*400));  
  15.         }  
  16.     }  
  17.     public interface OnItemClickListener{  
  18.         void ItemClickListener(View view,int postion);  
  19.         void ItemLongClickListener(View view,int postion);  
  20.     }  
  21.     public void setOnClickListener(OnItemClickListener listener){  
  22.         this.mListener = listener;  
  23.     }  
  24.     @Override  
  25.     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {  
  26.         View view = LayoutInflater.from(context).inflate(R.layout.item,parent,false);  
  27.         MyViewHolder viewHolder = new MyViewHolder(view);  
  28.         return viewHolder;  
  29.     }  
  30.   
  31.     @Override  
  32.     public void onBindViewHolder(final MyViewHolder holder, int position) {  
  33.         ViewGroup.LayoutParams params =  holder.itemView.getLayoutParams();//得到item的LayoutParams布局参数  
  34.         params.height = heights.get(position);//把随机的高度赋予item布局  
  35.         holder.itemView.setLayoutParams(params);//把params设置给item布局  
  36.   
  37.         holder.mTv.setText(lists.get(position));//为控件绑定数据  
  38.         if(mListener!=null){//如果设置了监听那么它就不为空,然后回调相应的方法  
  39.             holder.itemView.setOnClickListener(new View.OnClickListener() {  
  40.                 @Override  
  41.                 public void onClick(View v) {  
  42.                 int pos = holder.getLayoutPosition();//得到当前点击item的位置pos  
  43.                 mListener.ItemClickListener(holder.itemView,pos);//把事件交给我们实现的接口那里处理  
  44.                 }  
  45.             });  
  46.             holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {  
  47.                 @Override  
  48.                 public boolean onLongClick(View v) {  
  49.                     int pos = holder.getLayoutPosition();//得到当前点击item的位置pos  
  50.                     mListener.ItemLongClickListener(holder.itemView,pos);//把事件交给我们实现的接口那里处理  
  51.                     return true;  
  52.                 }  
  53.             });  
  54.         }  
  55.     }  
  56.   
  57.     @Override  
  58.     public int getItemCount() {  
  59.         return lists.size();  
  60.     }  
  61. }  
  62. class MyViewHolder extends RecyclerView.ViewHolder{  
  63.     TextView mTv;  
  64.     public MyViewHolder(View itemView) {  
  65.         super(itemView);  
  66.         mTv = (TextView) itemView.findViewById(R.id.textView);  
  67.     }  
  68. }  

源码下载地址:http://download.csdn.net/detail/u010687392/8868745


【注】:我们在使用RecyclerView时,更多的是通过网络请求得到数据,比如在加载图片或者列表项时,我们往往需要判断当前屏幕上显示的第一个item的postion是多少,最后一个item的postion是多少,当前屏幕共显示了几个item项,如果使用ListView或者GridView来判断当然好判断,只要实现AbsListView.OnScrollListener这个接口就可以得到,那么在RecyclerView中如何得到呢?RecyclerView中只提供了一个滚动监听器addOnScrollListener,并且不能实现AbsListView.OnScrollListener这个接口,那怎么获取呢?就是通过RecyclerView中的LayoutManager,我们使用RecyclerView时候都必须设置一个LayoutManager布局管理器,通过它我们可以轻松的得到当前屏幕共有几个item,第一个item的postion等数据,即:

[java] view plain copy
 print?
  1. int firstIndex = mLayoutManager.findFirstVisibleItemPosition();//返回当前屏幕第一个显示的item的postion  
  2. int firstComIndex = mLayoutManager.findFirstCompletelyVisibleItemPosition();//返回当前屏幕第一个完全显示的item的postion  
  3. int lastIndex = mLayoutManager.findLastVisibleItemPosition();//返回当前屏幕最后一个显示的item的position  
  4. int lastComIndex = mLayoutManager.findLastCompletelyVisibleItemPosition();//返回当前屏幕最后一个完全显示的item的posion  
  5. View view = mLayoutManager.findViewByPosition(int postion);//返回对应postion的itemView  
0 0
原创粉丝点击