referece to : http://blog.csdn.net/u010687392
在上篇中我們知道RecyclerView中默認給我們提供了三種布局管理器,分別是LinearLayoutManager、 GridLayoutManager、StaggeredGridLayoutManager。其中 StaggeredGridLayoutManager可實現交錯式網格布局,正好可以用來實現瀑布流。
下面先看看效果圖吧,再貼代碼:

其中大部分內容實現其實是和上篇文章是一樣的,就不多敘述了,就一個地方不同,就是我們在適配器中綁定ViewHolder的方法中需要重新給我們的itemView布局設置height,我這里是生成隨機數來設置高度的,代碼實現為:
private void getRandomHeight(List<String> lists){//得到隨機item的高度 heights = new ArrayList<>(); for (int i = 0; i < lists.size(); i++) { heights.add((int)(200+Math.random()*400)); } }
在onBindViewHolder方法中:
ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();//得到item的LayoutParams布局參數 params.height = heights.get(position);//把隨機的高度賦予itemView布局 holder.itemView.setLayoutParams(params);//把params設置給itemView布局
從而實現瀑布流效果。
貼一下代碼吧:
MainActivity.java
public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private List<String> lists; private MyRecyclerAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); mRecyclerView = (RecyclerView) this.findViewById(R.id.recyclerView); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); // mRecyclerView.addItemDecoration();//設置分割線 mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));//設置RecyclerView布局管理器為2列垂直排布 adapter = new MyRecyclerAdapter(this,lists); mRecyclerView.setAdapter(adapter); adapter.setOnClickListener(new MyRecyclerAdapter.OnItemClickListener() { @Override public void ItemClickListener(View view, int postion) { Toast.makeText(MainActivity.this,"點擊了:"+postion,Toast.LENGTH_SHORT).show(); } @Override public void ItemLongClickListener(View view, int postion) { //長按刪除 lists.remove(postion); adapter.notifyItemRemoved(postion); } }); } private void initData() { lists = new ArrayList(); for (int i = 0; i < 100; i++) { lists.add("" + i); } } }
MyRecyclerAdapter.java
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyViewHolder> { private List<String> lists; private Context context; private List<Integer> heights; private OnItemClickListener mListener; public MyRecyclerAdapter(Context context,List<String> lists) { this.context = context; this.lists = lists; getRandomHeight(this.lists); } private void getRandomHeight(List<String> lists){//得到隨機item的高度 heights = new ArrayList<>(); for (int i = 0; i < lists.size(); i++) { heights.add((int)(200+Math.random()*400)); } } public interface OnItemClickListener{ void ItemClickListener(View view,int postion); void ItemLongClickListener(View view,int postion); } public void setOnClickListener(OnItemClickListener listener){ this.mListener = listener; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item,parent,false); MyViewHolder viewHolder = new MyViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(final MyViewHolder holder, int position) { ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();//得到item的LayoutParams布局參數 params.height = heights.get(position);//把隨機的高度賦予item布局 holder.itemView.setLayoutParams(params);//把params設置給item布局 holder.mTv.setText(lists.get(position));//為控件綁定數據 if(mListener!=null){//如果設置了監聽那么它就不為空,然后回調相應的方法 holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int pos = holder.getLayoutPosition();//得到當前點擊item的位置pos mListener.ItemClickListener(holder.itemView,pos);//把事件交給我們實現的接口那里處理 } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { int pos = holder.getLayoutPosition();//得到當前點擊item的位置pos mListener.ItemLongClickListener(holder.itemView,pos);//把事件交給我們實現的接口那里處理 return true; } }); } } @Override public int getItemCount() { return lists.size(); } } class MyViewHolder extends RecyclerView.ViewHolder{ TextView mTv; public MyViewHolder(View itemView) { super(itemView); mTv = (TextView) itemView.findViewById(R.id.textView); } }
源碼下載地址:http://www.it165.net/uploadfile/files/2015/0705/recyclerView2.rar
轉載請注明出處-http://blog.csdn.net/u010687392
