RecyclerView的简单使用

前端之家收集整理的这篇文章主要介绍了RecyclerView的简单使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

以前都是用的listView,但是v7包提供了一个比listView更好用的,具有listView所有功能的组件,那就是recyclerview,它设置布局的时候,不仅有线性布局(listview的布局),还有表格布局,以及瀑布流布局,而且每种布局都可以设置成横向或者纵向,功能简直强大。它除了布局设置,还有分隔线设置,以及添加删除的动画设置,不过这些只是提供了一种默认的可以使用,一般情况需要自定义。它的适配器比listView的要简单。但是它没有提供item的点击和长按事件,这里需要自己设置回调事件。虽然他没有点击和长按事件不过它的viewholder加载的view有点击和长按事件,设置回调事件,得从这里入手。

使用RecyclerView要导入v7的依赖包虽然Android studio新建项目就会导入v7的appcompat依赖,不过里面并没有这个组件,这个组件要单独导入依赖。

  1. dependencies {
  2. compile fileTree(dir: 'libs',include: ['*.jar'])
  3. androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',{
  4. exclude group: 'com.android.support',module: 'support-annotations'
  5. })
  6. compile 'com.android.support:recyclerview-v7:25.3.1'
  7. compile 'com.android.support:appcompat-v7:25.3.1'
  8. compile 'com.android.support.constraint:constraint-layout:1.0.2'
  9. testCompile 'junit:junit:4.12'
  10. }

直接上代码代码里有说明

item的布局,就是一个imagview和textview,而Data则是与它对应的一个设置图片的int,与一个设置文字的string代码就不贴了。只贴适配器和主活动代码

  1. public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
  2.  
  3. public LinkedList<Data> datas;
  4. public Context context;
  5.  
  6. public MyAdapter(LinkedList<Data> datas,Context context){
  7. this.context=context;
  8. this.datas=datas;
  9. }
  10.  
  11. public void add(Data data){
  12. if(datas==null)
  13. datas=new LinkedList<Data>();
  14. datas.add(data);
  15.  
  16. //如果使用notifyDataSetChanged()则没有添加的动画效果
  17. //notifyDataSetChanged();
  18. notifyItemInserted(datas.size()-1);
  19. }
  20. public void remove(int position){
  21. if(datas!=null){
  22. datas.remove(position);
  23.  
  24. //如果使用notifyDataSetChanged()则没有移除的动画效果
  25. //notifyDataSetChanged();
  26. notifyItemRemoved(position);
  27. }
  28. }
  29. public void modify(Data data,int position){
  30. datas.set(position,data);
  31. notifyDataSetChanged();
  32. }
  33.  
  34. //事件监听的回调接口
  35. public interface OnItemClickListener{
  36. void onItemClick(View view,int postion);
  37. void onItemLongClick(View view,int postion);
  38. }
  39. private OnItemClickListener mlistener;
  40. public void setOnItemClickListener(OnItemClickListener mlistener){
  41. this.mlistener=mlistener;
  42. }
  43.  
  44. @Override
  45. public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
  46. //加载布局创建viewholder
  47. View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycle,parent,false);
  48. ViewHolder viewHoder=new ViewHolder(view);
  49. return viewHoder;
  50. }
  51.  
  52. @Override
  53. public void onBindViewHolder(final ViewHolder holder,int position) {
  54. //为viewholder绑定数据
  55. holder.imageView.setImageResource(datas.get(position).imgid);
  56. holder.textView.setText(datas.get(position).text);
  57.  
  58. if(mlistener!=null){
  59. holder.itemView.setOnClickListener(new View.OnClickListener() {
  60. @Override
  61. public void onClick(View v) {
  62. int pos=holder.getLayoutPosition();
  63. mlistener.onItemClick(holder.itemView,pos);
  64. }
  65. });
  66. holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
  67. @Override
  68. public boolean onLongClick(View v) {
  69. int pos=holder.getLayoutPosition();
  70. mlistener.onItemLongClick(holder.itemView,pos);
  71. return true;
  72. }
  73. });
  74. }
  75. }
  76.  
  77.  
  78. @Override
  79. public int getItemCount() {
  80. return datas==null ? 0:datas.size();
  81. }
  82.  
  83. public static class ViewHolder extends RecyclerView.ViewHolder{
  84.  
  85. ImageView imageView;
  86. TextView textView;
  87.  
  88. public ViewHolder(View itemView) {
  89. super(itemView);
  90. imageView= (ImageView) itemView.findViewById(R.id.img);
  91. textView= (TextView) itemView.findViewById(R.id.text);
  92. }
  93. }
  94. }
  1. public class MainActivity extends AppCompatActivity {
  2.  
  3. private MyAdapter myAdapter;
  4. private LinkedList<Data> datas;
  5. private RecyclerView recyclerView;
  6.  
  7. private Button button;
  8.  
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13.  
  14. button= (Button) findViewById(R.id.button);
  15.  
  16. initrecycler();
  17. listen();
  18. }
  19.  
  20. public void initrecycler(){
  21. recyclerView= (RecyclerView) findViewById(R.id.recycle);
  22. datas=new LinkedList<Data>();
  23. for(int i=0;i<10;i++){
  24. datas.add(new Data(R.mipmap.ic_launcher,"item "+i));
  25. }
  26. myAdapter=new MyAdapter(datas,MainActivity.this);
  27. //设置布局为线性布局,默认竖直
  28. recyclerView.setLayoutManager(new LinearLayoutManager(this));
  29.  
  30. // //设置布局为横向的线性布局,false表示方向向右。
  31. // recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));
  32.  
  33. // //设置布局为网格3列布局,默认竖直
  34. // recyclerView.setLayoutManager(new GridLayoutManager(this,3));
  35.  
  36. // //设置布局为3列的瀑布流布局。
  37. // recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
  38.  
  39. recyclerView.setAdapter(myAdapter);
  40. //设置添加删除的动画效果
  41. recyclerView.setItemAnimator(new DefaultItemAnimator());
  42. //设置横向分割线
  43. recyclerView.addItemDecoration(new DividerItemDecoration(MainActivity.this,LinearLayoutManager.VERTICAL));
  44. }
  45.  
  46. public void listen(){
  47. //RecyclerView没有点击和长按事件监听,所以自己设置回调事件
  48. myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
  49. @Override
  50. public void onItemClick(View view,int postion) {
  51. Toast.makeText(MainActivity.this,"点击"+postion,Toast.LENGTH_SHORT).show();
  52. myAdapter.add(new Data(R.mipmap.ic_launcher,"新来的"));
  53. }
  54.  
  55. @Override
  56. public void onItemLongClick(View view,"长按"+postion,Toast.LENGTH_SHORT).show();
  57. myAdapter.remove(postion);
  58. }
  59. });
  60.  
  61. button.setOnClickListener(new View.OnClickListener() {
  62. @Override
  63. public void onClick(View v) {
  64.  
  65. myAdapter.modify(new Data(R.mipmap.ic_launcher,"修改的"),0);
  66. }
  67. });
  68. }
  69. }

这样的话点击或者长按,每个item没有背景颜色变化,不像listView那样变成灰色。解决办法很简单,给每个item布局里面设置一个selector背景就OK了,不清楚selector背景用法的读者自行百度下。 适配器类里面除了一个事件回调接口,还有继承的类要传一个自己的viewholder进去,其他的跟listView的适配器大同小异,就不做太多说明,

猜你在找的设计模式相关文章