RecycleView是Android L版本中新添的一个用来取代ListView SDK的控件,RecycleView具有灵活性好,扩展性强等功能,一经推出就受到了很大的欢迎,下边是小编闲暇时写的一个简单的demo,供还没有习惯用recycleView来开发的兄台参考:
1、先看一下主界面布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.wls.recycletext.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recycle_view" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/btn_add" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="btnClick" android:text="添加数据"/> <Button android:id="@+id/btn_remove" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="btnClick" android:text="移除数据"/> </LinearLayout>很简单的一个线性布局,这里我添加了两个按钮,用来实现数据的添加和删除,点击和长按事件
2、Activity中主要代码:
private RecyclerView mRecycleView; private String [] datas = {"头条","新闻","财经","视频","音乐","美女","图片","糗百","笑话","小品" ,"科技","小说","搞笑","百思不得姐","直播"}; private ArrayList<String> mList; private TextAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); loadData(); } /** 初始化控件 */ private void init() { mRecycleView = (RecyclerView) findViewById(R.id.recycle_view); mList = new ArrayList<>(); adapter = new TextAdapter(this,mList); } /** 数据的加载 */ private void loadData() { for(int i = 0; i <datas.length; i++){ mList.add(datas[i]); } /** * 设置布局管理器 * lsitview样式则为new LinearLayoutManager(this) * GridView样式则为new GridLayoutManager(this,3) * 瀑布流样式则为new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL) * */ // mRecycleView.setLayoutManager(new LinearLayoutManager(this)); mRecycleView.setLayoutManager(new GridLayoutManager(this,3)); // mRecycleView.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL)); /** 自定义间距 */ int space = getResources().getDimensionPixelOffset(R.dimen.space); mRecycleView.addItemDecoration(new SpaceItemDecoration(space)); //设置item动画 mRecycleView.setItemAnimator(new DefaultItemAnimator()); mRecycleView.setAdapter(adapter); adapter.setmOnItemClick(this); } public void btnClick(View view){ switch (view.getId()){ case R.id.btn_add: adapter.addDatas(0,"数码"); break; case R.id.btn_remove: adapter.removeDatas(0); break; } } @Override public void OnClickListener(View view, int position) { Toast.makeText(this,"点击了第" + position + "个item",Toast.LENGTH_LONG).show(); } @Override public void OnLongPressListener(View view, int position) { Toast.makeText(this,"长按了第" + position + "个item",Toast.LENGTH_LONG).show(); }
关于RecycleView的处理有很多方式,像自定义item动画,分割线的设置等,这里只是处理了数据的添加,删除,item的点击和长按等时间,以及RecycleView的一些属性介绍,比较坑的就是RecycleView并没有ListView中的addHeaderView和addFooterView,这两个方法,如果想要添加头部和尾部的话,就需要自定义的去修改来实现,不过Github上已经有了实现代码:https://github.com/blipinsk/RecyclerViewHeader这里介绍了如何给RecycleView增加头部,当然也可以参考张鸿洋大神的博客:http://blog.youkuaiyun.com/lmj623565791/article/details/51854533
3、RecycleView的适配器:
public class TextAdapter extends RecyclerView.Adapter<TextAdapter.TextViewHolder>{ private Context context; private ArrayList<String> datas; private OnItemClick mOnItemClick; public TextAdapter(Context context,ArrayList<String> datas){ this.context = context; this.datas = datas; } public void setmOnItemClick(OnItemClick mOnItemClick) { this.mOnItemClick = mOnItemClick; } /** 添加数据 */ public void addDatas(int position,String value){ if(position > datas.size()){ position = datas.size(); } if(position < 0){ position = 0; } datas.add(position,value); /** * 在指定位置添加数据 * 使用notifyItemInserted和notifyItemRemoved时有动画效果 * 使用notifyDataSetChanged()时,没有动画效果 * */ notifyItemInserted(position); // notifyDataSetChanged(); } /** 移除数据 */ public void removeDatas(int position){ if(position > datas.size() - 1){ return; } datas.remove(position); /** * 移除指定位置的数据 */ notifyItemRemoved(position); } @Override public TextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.adapter_recycleview,parent,false); return new TextViewHolder(view); } @Override public void onBindViewHolder(TextViewHolder holder, int position) { bindData(holder,position); } /** 绑定数据 */ private void bindData(TextViewHolder holder, final int position) { holder.mTextView.setText(datas.get(position)); holder.mTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClick.OnClickListener(v,position); } }); holder.mTextView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { mOnItemClick.OnLongPressListener(v,position); return true; } }); } @Override public int getItemCount() { return datas.size() ; } interface OnItemClick{ public void OnClickListener(View view,int position); public void OnLongPressListener(View view,int position); } class TextViewHolder extends RecyclerView.ViewHolder{ TextView mTextView; public TextViewHolder(View itemView) { super(itemView); mTextView = (TextView) itemView.findViewById(R.id.text_view); } } }
RecyclerView使用的是全新的适配器。与AdapterView使用的适配器类似,但也略有不同,比如RecyclerView必须使用标准化ViewHolder。使用时需要重写两个主要方法onCreateViewHolder和onBindViewHolder:分别用来展现视图和它的持有者和把数据绑定到视图上。这样设计的优势在于只有当我们真正需要去创建一个新视图才会调用onCreateViewHolder,不需要去检查它是否已被回收,然后再与数据绑定。而且RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件,这就需要开发者自己实现,代码中利用了接口回调的方式来为Item增加点击和长按监听关于RecycleView的的适配器的封装:https://github.com/Wan7451/Wan_RecycleViewAdapter
4、item布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:background="#7c7a7a"> <TextView android:id="@+id/text_view" android:layout_width="match_parent" android:layout_height="48dp" android:gravity="center"/>
5、看一下效果:
RecycleView动画的处理:https://github.com/wasabeef/recyclerview-animators