RecycleView是5.0之后推出的一个新控件,所以使用就要先导入一个依赖包:
compile 'com.android.support:recyclerview-v7:22.2.1'
2.实现的效果挺好看的,需要的赶紧来试一下,真的感觉跟瀑布一样,虽然错乱,但是也形成的一个专属于它的风格,下面介绍一下怎么实现的: (在我的一篇文章RecycleView的分割线里,详细的介绍了RecycleView5.0的新特性,大家要想了解,可以随时看呦)
MainActivity
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.view.View; import android.widget.Toast; import android.support.v7.widget.StaggeredGridLayoutManager; /** * 瀑布流原理:其实就是动态的将recycle下的网格布局的每个item的高度进行动态随机设置--》LayoutParmas * */ public class MainActivity extends Activity{ private RecyclerView mRecy; private List<String> list; private MyRecycleView adapter; //适配器 @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化数据源 initList(); //初始化控件 initView(); } private void initView() { mRecy=(RecyclerView) findViewById(R.id.mRecy); adapter=new MyRecycleView(MainActivity.this, list); //spanCount:列数 orientation:线性方向 //StaggeredGridLayoutManager:recycleView下的实现gridView的管理器 mRecy.setLayoutManager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL) ); mRecy.setAdapter(adapter); //设置条目动画:默认的 mRecy.setItemAnimator(new DefaultItemAnimator()); //设置点击事件 onClick(); } //点击事件其实是调用的适配器里面的点击事件 private void onClick() { adapter.setOnItemClickListener(new MyRecycleView.onItemClickListerner() { @Override public void onLongItemClick(View view, int position) { //调用适配器里面的删除的方法 adapter.RemoveView(position); } @Override public void onItemClick(View view, int position) { Toast.makeText(MainActivity.this, "点击了第"+(position+1)+"条数据", 0).show(); } }); } private void initList() { list=new ArrayList<String>(); for(int i=0;i<40;i++){ list.add("第"+(i+1)+"条数据"); } } }
MyRecycleView
mHeights.add((int)(150+Math.random()*300));//随机获取高度,添加到集合中这一句话实现了每个item的高度,但是都是随机给的高度,可以看出大大小小有点不相同。
import java.util.ArrayList; import java.util.List; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.TextView; /* * recycleView 适配器 * */ public class MyRecycleView extends RecyclerView.Adapter<MyRecycleView.MyViewHolder>{ private Context ctx; private List<String> list; private List<Integer> mHeights;//这个是每个item的随机高度集合 private onItemClickListerner listener;//自己写的回调接口 public MyRecycleView(Context ctx,List<String> list) { this.ctx=ctx; this.list=list; //初始化item的随机高度,准备后期动态添加 mHeights=new ArrayList<Integer>(); for(int i=0;i<list.size();i++){ mHeights.add((int)(150+Math.random()*300));//随机获取高度,添加到集合中 } } @Override public int getItemCount() { return list.size(); } @Override public void onBindViewHolder(final MyViewHolder holder, int position) { //动态更改item的高度啊 LayoutParams lp=holder.mTv.getLayoutParams(); lp.height=mHeights.get(position); holder.mTv.setLayoutParams(lp); holder.mTv.setText(list.get(position)); //设置回调 if(listener!=null){ holder.itemView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int pos=holder.getAdapterPosition(); //回调 listener.onItemClick(holder.itemView, pos); } }); holder.itemView.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { int pos=holder.getAdapterPosition(); listener.onLongItemClick(holder.itemView, pos); // RemoveView(pos); return false; } }); } } @Override public MyRecycleView.MyViewHolder onCreateViewHolder(ViewGroup view, int position) { //c初始化及导入item布局 给holder MyViewHolder holder=new MyViewHolder(View.inflate(ctx, R.layout.item, null)); return holder; } // 自己创建的内部类,让它继承自recycleView下的ViewHolder class MyViewHolder extends ViewHolder{ TextView mTv; public MyViewHolder(View view) { super(view); //找id mTv=(TextView) view.findViewById(R.id.mTv); } } //自己定义的回调接口 public interface onItemClickListerner{ void onItemClick(View view,int position); void onLongItemClick(View view,int position); } //设置回调接口的方法 public void setOnItemClickListener(onItemClickListerner listener){ this.listener=listener; } //删除选中条目的方法 public void RemoveView(int position){ list.remove(position); notifyItemRemoved(position); } }
xml.布局
activity_main
<android.support.v7.widget.RecyclerView android:id="@+id/mRecy" android:layout_width="match_parent" android:layout_height="match_parent" />item
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/mTv" android:layout_width="100dp" android:layout_height="100dp" android:gravity="center" android:background="#28c8b7" android:layout_marginTop="5dp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_marginBottom="5dp" android:text="1" /> </LinearLayout>//如发现一个类式的,那是之前使用的号,为了给大家讲解的更清晰,就又申请了一个博客。