android5.0中RecycleView的用法

时间:2023-12-26 14:39:25

最近学习了android5.0中新增的一个组件RecycleView,是用来代替当前的listview开发的,是因为在RecycleView中已经有了viewholder缓存,并且不同的item之间可以设置不同的布局。能非常有效地维护了意见数量有限,滚动大的数据集。使用 RecyclerView当你拥有的数据的集合,它的元素在运行时改变基于用户行为和网络事件的小部件

首先看看RecyclerView的一个小例子:

需要引入:android-support-v7-appcompat.jar

android-v7-RecyclerView.jar来支持低版本的android系统

新建一个my_layout.xml布局文件:里边放置一个RecyclerView

  1. <android.support.v7.widget.RecyclerView
  2. android:id="@+id/rvlist"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:scrollbars="vertical"
  6. />

在之前的listview开发中,我们需要自定义viewholder来缓存listView中的数据,而在RecyclerView中,已经封装好了viewholder在adapter中,接下来自定义我们的adapter

  1. public class MyAdapter2 extends RecyclerView.Adapter<MyAdapter2.ViewHolder>
  2. {
  3. // 数据集
  4. private String[] mDataset;
  5. public MyAdapter2(String[] dataset)
  6. {
  7. super();
  8. mDataset = dataset;
  9. }
  10. @Override
  11. public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
  12. {
  13. // 创建一个View,简单起见直接使用系统提供的布局,就是一个TextView
  14. View view = View.inflate(viewGroup.getContext(),R.layout.viewholder_item, null);
  15. // 创建一个ViewHolder
  16. ViewHolder holder = new ViewHolder(view);
  17. return holder;
  18. }
  19. @Override
  20. public void onBindViewHolder(ViewHolder viewHolder, int i)
  21. {
  22. // 绑定数据到ViewHolder上
  23. viewHolder.mTextView.setText(mDataset[i]);
  24. }
  25. @Override
  26. public int getItemCount()
  27. {
  28. return mDataset.length;
  29. }
  30. public static class ViewHolder extends RecyclerView.ViewHolder
  31. {
  32. public TextView mTextView;
  33. public ViewHolder(View itemView)
  34. {
  35. super(itemView);
  36. //          mTextView = (TextView) itemView;
  37. mTextView = (TextView) itemView.findViewById(R.id.view_text_id);
  38. }
  39. }
  40. }

在activity这样调用,并设置adapter

  1. RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvlist);
  2. // 创建一个线性布局管理器
  3. LinearLayoutManager layoutManager = new LinearLayoutManager(this);
  4. layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
  5. // 设置布局管理器
  6. recyclerView.setLayoutManager(layoutManager);
  7. // 创建数据集
  8. String[] dataset = new String[100];
  9. for (int i = 0; i < dataset.length; i++){
  10. dataset[i] = "item" + i;
  11. }
  12. // 创建Adapter,并指定数据集
  13. MyAdapter2 adapter = new MyAdapter2(dataset);
  14. // 设置Adapter
  15. recyclerView.setAdapter(adapter);
  16. }

运行效果:

android5.0中RecycleView的用法

在这个例子中只是用到了最基本的布局,下面结合android中新增的CardView和RecycleView实现一个复杂的布局:

先看效果图:

android5.0中RecycleView的用法android5.0中RecycleView的用法

CardView继承自FrameLayout,允许你在card视图中显示信息. CardView也可以设置阴影和圆角。(其实现在很多应用都自定义了Card视图,Google这回将card视图作为基本控件,可以拿来直接使用了)

Layout中为CardView设置圆角使用card_view:cardCornerRadius属性

代码中为CardView设置圆角使用CardView.setRadius方法

为CardView设置背景颜色使用card_view:cardBackgroundColor属性

1.在item布局中引入cardview组件

  1. <android.support.v7.widget.CardView
  2. android:id="@+id/cardview_id"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. app:cardCornerRadius="5dp"
  6. app:cardElevation="0dp" >
  7. <RelativeLayout
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. android:padding="5dp" >
  11. <ImageView
  12. android:id="@+id/image_id"
  13. android:layout_width="20dp"
  14. android:layout_height="20dp"
  15. android:layout_alignParentLeft="true"
  16. />
  17. <TextView
  18. android:id="@+id/text_id"
  19. android:layout_width="wrap_content"
  20. android:layout_height="match_parent"
  21. android:textColor="#f89ef5"
  22. android:textSize="20dp"
  23. android:layout_centerInParent="true" />
  24. </RelativeLayout>
  25. </android.support.v7.widget.CardView>

需要注意的是要在最底层的layout中引入cardview的命名空间:

xmlns:app=http://schemas.android.com/apk/res-auto

要实现不同的item有不同的布局,需要有一个type字段来作为区分,这里,我新建一个UserInfo类,如下:

  1. public class UserInfo {
  2. public static final int hasImage = 1;
  3. public static final int noImage = 2;
  4. private String mUserName;
  5. private int userImage;
  6. int type;
  7. public String getmUserName() {
  8. return mUserName;
  9. }
  10. public void setmUserName(String mUserName) {
  11. this.mUserName = mUserName;
  12. }
  13. public int getUserImage() {
  14. return userImage;
  15. }
  16. public void setUserImage(int userImage) {
  17. this.userImage = userImage;
  18. }
  19. public int getType() {
  20. return type;
  21. }
  22. public void setType(int type) {
  23. this.type = type;
  24. }
  25. public UserInfo(String mUserName, int type) {
  26. this.mUserName = mUserName;
  27. this.type = type;
  28. }
  29. public UserInfo(String mUserName, int userImage, int type) {
  30. this.mUserName = mUserName;
  31. this.userImage = userImage;
  32. this.type = type;
  33. }
  34. }

hasImage和noImage分别表示该item需不需要加载图片,来加载不同的布局。

接下来看看Adapter的代码:

  1. public class MyAdapter extends RecyclerView.Adapter<ViewHolder>{
  2. private List<UserInfo>mList = null;
  3. private Context context = null;
  4. public MyAdapter(List<UserInfo> mList, Context context) {
  5. super();
  6. this.mList = mList;
  7. this.context = context;
  8. //      for (int i = 0; i < mList.size(); i++) {
  9. //          Log.d("liuhang","==="+mList.get(i).getmUserName()+"==="+mList.get(i).getUserImage());
  10. //      }
  11. }
  12. public void addToList(UserInfo info,int position) {
  13. mList.add(0, info);
  14. notifyItemInserted(position);
  15. notifyDataSetChanged();
  16. }
  17. public class TextOnClick implements OnClickListener {
  18. private int position = 0;
  19. public TextOnClick(int position) {
  20. this.position = position;
  21. }
  22. @Override
  23. public void onClick(View v) {
  24. Toast.makeText(context,"text the name:"+mList.get(position).getmUserName(),1000).show();
  25. }
  26. }
  27. public class ImageOnclick implements OnClickListener {
  28. private int position = 0;
  29. public ImageOnclick(int position) {
  30. this.position = position;
  31. }
  32. @Override
  33. public void onClick(View v) {
  34. // TODO Auto-generated method stub
  35. Toast.makeText(context,"image the imageId:"+mList.get(position).getUserImage(),1000).show();
  36. }
  37. }
  38. public class ItemOnClick implements OnItemClickListener {
  39. @Override
  40. public void onItemClick(AdapterViewCompat<?> arg0, View arg1, int arg2,
  41. long arg3) {
  42. // TODO Auto-generated method stub
  43. Toast.makeText(context,"you choose the item",1000).show();
  44. }
  45. }
  46. @Override
  47. public int getItemCount() {
  48. return mList.size();
  49. }
  50. public class TextViewHolder extends RecyclerView.ViewHolder {
  51. public TextView textView = null;
  52. public TextViewHolder(View view) {
  53. super(view);
  54. this.textView = (TextView) view.findViewById(R.id.text_id);
  55. }
  56. }
  57. public class ImageTextViewHolder extends RecyclerView.ViewHolder {
  58. public ImageView imageView = null;
  59. public TextView textView = null;
  60. public ImageTextViewHolder(View view) {
  61. super(view);
  62. this.imageView = (ImageView) view.findViewById(R.id.image_id);
  63. this.textView = (TextView) view.findViewById(R.id.text_id);
  64. }
  65. }
  66. @Override
  67. public int getItemViewType(int position) {
  68. // TODO Auto-generated method stub
  69. return mList.get(position).getType();
  70. }
  71. @Override
  72. public void onBindViewHolder(ViewHolder holder, int position) {
  73. switch (getItemViewType(position)) {
  74. case UserInfo.hasImage:
  75. ImageTextViewHolder imageTextViewHolder = (ImageTextViewHolder) holder;
  76. imageTextViewHolder.imageView.setImageResource(mList.get(position).getUserImage());
  77. imageTextViewHolder.textView.setText(mList.get(position).getmUserName());
  78. imageTextViewHolder.textView.setOnClickListener(new TextOnClick(position));
  79. imageTextViewHolder.imageView.setOnClickListener(new ImageOnclick(position));
  80. break;
  81. case UserInfo.noImage:
  82. TextViewHolder textViewHolder = (TextViewHolder) holder;
  83. textViewHolder.textView.setText(mList.get(position).getmUserName());
  84. textViewHolder.textView.setOnClickListener(new TextOnClick(position));
  85. }
  86. }
  87. @Override
  88. public ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
  89. ViewHolder holder = null;
  90. View view = null;
  91. switch (type) {
  92. case UserInfo.hasImage:
  93. view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_text_image_item,null);
  94. holder = new ImageTextViewHolder(view);
  95. break;
  96. case UserInfo.noImage:
  97. view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_text_item,null);
  98. holder = new TextViewHolder(view);
  99. break;
  100. }
  101. <a target=_blank href="http://download.csdn.net/detail/mockingbirds/8312357">源码下载</a>
  102. return holder;
  103. }
  104. }

在activity中这样调用:

    1. RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_id);
    2. recyclerView.setHasFixedSize(true);
    3. LinearLayoutManager linaLayout = new LinearLayoutManager(this);
    4. linaLayout.setOrientation(1);
    5. recyclerView.setLayoutManager(linaLayout);
    6. recyclerView.getRecycledViewPool().setMaxRecycledViews(0, 10);
    7. int[]userImage = {R.drawable.icon08,R.drawable.icon00,R.drawable.icon01,
    8. R.drawable.icon02,R.drawable.icon03,R.drawable.icon04,
    9. R.drawable.icon05,R.drawable.icon06,R.drawable.icon07};
    10. List<UserInfo>userList = new ArrayList<UserInfo>();
    11. int position = 0;
    12. for (int i = 0; i < 35; i++) {
    13. position = (int) (Math.random() * 8);
    14. UserInfo userInfo1 = new UserInfo("zhangsan"+i,2);
    15. UserInfo userInfo2 = new UserInfo("lisi"+i,userImage[position],1);
    16. userList.add(userInfo1);
    17. userList.add(userInfo2);
    18. }
    19. final MyAdapter adapter= new MyAdapter(userList, this);
    20. recyclerView.setAdapter(adapter);
    21. recyclerView.setOnClickListener(new OnClickListener() {
    22. @Override
    23. public void onClick(View v) {
    24. // TODO Auto-generated method stub
    25. Toast.makeText(MyActivity.this,"you choose the item",1000).show();
    26. }
    27. });
    28. Button button = (Button) findViewById(R.id.add);
    29. button.setOnClickListener(new OnClickListener() {
    30. @Override
    31. public void onClick(View v) {
    32. adapter.addToList(new UserInfo("new add"+ newAdd++, 2),0);
    33. }
    34. });