RecyclerView是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视图缓冲.
RecyclerView的优点就是,他可以通过设置LayoutManager来快速实现listview、gridview、瀑布流的效果,而且还可以设置横向和纵向显示,添加动画效果也非常简单(自带了ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果),也是官方推荐使用的
实现:
在gradle中添加包
compile 'com.android.support:recyclerview-v7:25.3.1'
在xml实现布局
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent" />然后具体上代码了
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_add,btn_delete,btn_list,btn_grid,btn_flow; private RecyclerView recyclerView; private ArrayList<String> data; private MyRecycleViewAdataper adaper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); //设置 RecyclerView适配器 adaper=new MyRecycleViewAdataper(MainActivity.this,data); recyclerView.setAdapter(adaper); //LayoutManage recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false));//上下文/横纵/倒序否 recyclerView.scrollToPosition(data.size()-1);//滑到第几行 //添加分割线 //recyclerView.addItemDecoration(); 或者 主题中设置 android:listDivider //设置某条的监听 adaper.setOnItemClickListener(new MyRecycleViewAdataper.OnItemClickListener() { @Override public void onItemClick(View v, String data) { Toast.makeText(MainActivity.this, "data="+data, Toast.LENGTH_SHORT).show(); } }); //设置动画 recyclerView.setItemAnimator(new DefaultItemAnimator()); } //初始化数据 private void initData() { data=new ArrayList<String>(); for (int i=0;i<100;i++){ data.add("content"+i); } } private void initView() { btn_add= (Button) findViewById(R.id.btn_add); btn_delete= (Button) findViewById(R.id.btn_delete); btn_list= (Button) findViewById(R.id.btn_list); btn_grid= (Button) findViewById(R.id.btn_grid); btn_flow= (Button) findViewById(R.id.btn_flow); recyclerView= (RecyclerView) findViewById(R.id.recyclerview); btn_add.setOnClickListener(this); btn_delete.setOnClickListener(this); btn_list.setOnClickListener(this); btn_grid.setOnClickListener(this); btn_flow.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_add: //添加数据 adaper.addData(0,"new content"); recyclerView.scrollToPosition(0); break; case R.id.btn_delete: adaper.deleteData(0); //删除数据 break; case R.id.btn_list: //List效果 recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false));//上下文/横纵/倒序否 recyclerView.scrollToPosition(data.size()-1);//滑到第几行 break; case R.id.btn_grid: //Grid效果 recyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this,3,GridLayoutManager.VERTICAL,false));//上下文/3列/横纵/倒序否 //recyclerView.scrollToPosition(data.size()-1);//滑到第几行 break; case R.id.btn_flow: //瀑布流效果 recyclerView.setLayoutManager(new StaggeredGridLayoutManager(5,StaggeredGridLayoutManager.VERTICAL));//5列/横纵 //recyclerView.scrollToPosition(data.size()-1);//滑到第几行 break; } }
public class MyRecycleViewAdataper extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private ArrayList<String> data; public static enum ITEM_TYPE{ ITEM_TYPE_IMAGE, ITEM_TYPE_TEXT } public MyRecycleViewAdataper(Context context, ArrayList<String> data){ this.context=context; this.data=data; } /** * 相当于getView方法中创建View和ViewHold * @param parent * @param viewType * @return */ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if(viewType==ITEM_TYPE.ITEM_TYPE_IMAGE.ordinal()){ View itemView=View.inflate(context,R.layout.item_recycleview,null ); return new MyViewHold(itemView); }else{ View itemView=View.inflate(context,R.layout.item_recycleview2,null ); return new MyViewHold2(itemView); } } //item的布局分类 和 oncreatViewHolder中的ViewType对应 @Override public int getItemViewType(int position) { return position % 2 ==0 ? ITEM_TYPE.ITEM_TYPE_IMAGE.ordinal():ITEM_TYPE.ITEM_TYPE_TEXT.ordinal();//ordina 返回枚举的序数 } /**相当于getView绑定数据的部分代码 * 数据和View绑定 * @param holder * @param position */ @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if(holder instanceof MyViewHold ){ String datas=data.get(position); ((MyViewHold)holder).item_txt.setText(datas); }else{ String datas=data.get(position); ((MyViewHold2)holder).item_txt.setText(datas); } } /** * 得到总条数 * @return */ @Override public int getItemCount() { return data.size(); } //添加数据 public void addData(int position, String newcontent) { data.add(position,newcontent); //刷新 notifyItemInserted(position); } //删除数据 public void deleteData(int position) { data.remove(position); //刷新 notifyItemRemoved(position); } //ViewHold class MyViewHold extends RecyclerView.ViewHolder{ private ImageView item_iv; public TextView item_txt; public MyViewHold(View itemView) { super(itemView); item_iv= (ImageView) itemView.findViewById(R.id.item_iv); item_txt= (TextView) itemView.findViewById(R.id.item_txt); //点击整条 itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //点击回调到主界面 if(null!=onItemClickListener){ onItemClickListener.onItemClick(v,data.get(getLayoutPosition())); } } }); //点击图片 item_iv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //点击回调到主界面 if(null!=onItemClickListener){ onItemClickListener.onItemClick(v,data.get(getLayoutPosition())); } } }); } } class MyViewHold2 extends RecyclerView.ViewHolder{ public TextView item_txt; public MyViewHold2(View itemView) { super(itemView); item_txt= (TextView) itemView.findViewById(R.id.item_txt); } } public interface OnItemClickListener{ void onItemClick(View v,String data); } private OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } }
在转别人一个帖子
http://frank-zhu.github.io/android/2015/01/16/android-recyclerview-part-1/