• RecycleView + CardView 控件简析


    今天使用了V7包加入的RecycleView 和 CardView,写篇简析。

    先上效果图:

    原理图:

    这是RecycleView的工作原理:

    1.LayoutManager用来处理RecycleView的“列表”样式,Support包默认包含了:LinearLayoutManager  横向或纵向的滚动列表、

    GridLayoutManager  网格列表、StaggeredGridLayoutManager  交错的网格列表。

    2.Adapter负责处理RecycleView的数据和样式

    3.在传统的ListView中有一种常见的写法是使用ViewHolder来缓存数据集,在新版的RecycleView内置了ViewHolder这一模块,所以在Adapter内部新建内部类ViewHolder。

    4.RecycleView 和listView的一个区别就是本身不处理点击事件,点击事件应该绑在ViewHolder里面,可以直接写也可以通过接口绑在Adapter里面来实现。

     首先添加数据集:

     1 package com.lfk.drawapictiure.Info;
     2 
     3 /**
     4  * Created by liufengkai on 15/9/13.
     5  */
     6 public class MenuInfo {
     7     private String paint_name;
     8     private String paint_time;
     9     private String paint_root;
    10     private String paint_img_root;
    11 
    12     public MenuInfo(String paint_name, String paint_time,
    13                     String paint_root, String paint_img_root) {
    14         this.paint_name = paint_name;
    15         this.paint_time = paint_time;
    16         this.paint_root = paint_root;
    17         this.paint_img_root = paint_img_root;
    18     }
    19 
    20     public String getPaint_name() {
    21         return paint_name;
    22     }
    23 
    24     public String getPaint_time() {
    25         return paint_time;
    26     }
    27 
    28     public String getPaint_root() {
    29         return paint_root;
    30     }
    31 
    32     public String getPaint_img_root() {
    33         return paint_img_root;
    34     }
    35 }

    实现继承自RecycleView的Adapter中间要包裹自己实现的ViewHolder,onCreateviewHolder函数和onBindViewHolder实现了ListView里面getView的工作,分别为找到控件和控件赋值,

    实现点击的接口,设置接口并且绑在ViewHolder的itemView里面即根视图中。

     1 public class MainLayoutAdapter extends RecyclerView.Adapter<MainLayoutAdapter.MainViewHolder> {
     2     private LayoutInflater inflater;
     3     private ArrayList<MenuInfo> userList;
     4     private Context context;
     5     private MainItemClickListener itemClickListener;
     6 
     7     public MainLayoutAdapter(ArrayList<MenuInfo> userList, Context context) {
     8         this.userList = userList;
     9         this.context = context;
    10         this.inflater = LayoutInflater.from(context);
    11     }
    12 
    13     public void setItemClickListener(MainItemClickListener itemClickListener) {
    14         this.itemClickListener = itemClickListener;
    15     }
    16   //onCreateviewHolder函数和onBindViewHolder实现了ListView里面getView的工作,分别为找到控件和控件赋值
    17     @Override
    18     public MainLayoutAdapter.MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    19         View wrapper = inflater.inflate(R.layout.draw_item, parent, false);
    20         return new MainViewHolder(
    21                 wrapper,
    22                 (TextView)wrapper.findViewById(R.id.paint_name),
    23                 (TextView)wrapper.findViewById(R.id.paint_time),
    24                 (TextView)wrapper.findViewById(R.id.paint_root),
    25                 (ImageView)wrapper.findViewById(R.id.paint_img));
    26     }
    27 
    28     @Override
    29     public void onBindViewHolder(MainViewHolder holder, int position) {
    30         MenuInfo menuInfo = userList.get(position);
    31         holder.paint_img.setImageURI(Uri.parse(menuInfo.getPaint_img_root()));
    32         holder.paint_name.setText(menuInfo.getPaint_name());
    33         holder.paint_time.setText(menuInfo.getPaint_time());
    34         holder.paint_root.setText(menuInfo.getPaint_root());
    35     }
    36 
    37 
    38     @Override
    39     public int getItemCount() {
    40         return userList.size();
    41     }
    42 
    43     public class MainViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener{
    44         private TextView paint_name;
    45         private TextView paint_time;
    46         private TextView paint_root;
    47         private ImageView paint_img;
    48         public MainViewHolder(View itemView, TextView paint_name,
    49                           TextView paint_time, TextView paint_root,
    50                           ImageView paint_img) {
    51             super(itemView);
    52             itemView.setOnClickListener(this);
    53             this.paint_name = paint_name;
    54             this.paint_time = paint_time;
    55             this.paint_root = paint_root;
    56             this.paint_img = paint_img;
    57         }
    58 
    59         @Override
    60         public void onClick(View view) {
    61             MenuInfo menuInfo = userList.get(getAdapterPosition());
    62             itemClickListener.onItemClick(view,menuInfo.getPaint_name(),menuInfo.getPaint_root());
    63         }
    64 
    65         @Override
    66         public boolean onLongClick(View view) {
    67             return false;
    68         }
    69     }
    70 }

    Activity中的使用:

     1 package com.lfk.drawapictiure.Fragment;
     2 
     3 import android.content.Intent;
     4 import android.net.Uri;
     5 import android.os.Bundle;
     6 import android.os.Environment;
     7 import android.support.v7.widget.LinearLayoutManager;
     8 import android.support.v7.widget.RecyclerView;
     9 import android.view.LayoutInflater;
    10 import android.view.View;
    11 import android.view.ViewGroup;
    12 
    13 import com.lfk.drawapictiure.Adapter.MainLayoutAdapter;
    14 import com.lfk.drawapictiure.Info.MenuInfo;
    15 import com.lfk.drawapictiure.InterFace.MainItemClickListener;
    16 import com.lfk.drawapictiure.MainActivity;
    17 import com.lfk.drawapictiure.R;
    18 
    19 import java.util.ArrayList;
    20 
    21 
    22 public class PaintFragment extends android.support.v4.app.Fragment {
    23     private RecyclerView mRecyclerView;
    24     private MainLayoutAdapter mAdapter;
    25     private RecyclerView.LayoutManager mLayoutManager;
    26     private String path = Environment.getExternalStorageDirectory().getPath() + "/DrawAPicture";
    27 
    28     public static PaintFragment newInstance() {
    29         return new PaintFragment();
    30     }
    31 
    32     public PaintFragment() {
    33         // Required empty public constructor
    34     }
    35 
    36     @Override
    37     public void onCreate(Bundle savedInstanceState) {
    38         super.onCreate(savedInstanceState);
    39 
    40     }
    41 
    42     @Override
    43     public View onCreateView(LayoutInflater inflater, ViewGroup container,
    44                              Bundle savedInstanceState) {
    45         View wrapper = inflater.inflate(R.layout.fragment_paint, container, false);
    46         mRecyclerView = (RecyclerView)wrapper.findViewById(R.id.paint_recycle_view);
    47         mLayoutManager = new LinearLayoutManager(getActivity());
    48         mRecyclerView.setLayoutManager(mLayoutManager); //绑上列表管理器
    49         ArrayList<MenuInfo> arrayList = new ArrayList<>();
    50         arrayList.add(new MenuInfo("刘丰恺","09-13 05:28",path+"/"+"12138.lfk",path+"/"+"6826.jpg"));
    51         arrayList.add(new MenuInfo("刘丰恺","09-13 05:28",path+"/"+"12138.lfk",path+"/"+"6826.jpg"));
    52         arrayList.add(new MenuInfo("刘丰恺","09-13 05:28",path+"/"+"12138.lfk",path+"/"+"6826.jpg"));
    53         arrayList.add(new MenuInfo("刘丰恺","09-13 05:28",path+"/"+"12138.lfk",path+"/"+"6826.jpg"));
    54         mAdapter = new MainLayoutAdapter(arrayList, getActivity());
          // 设置点击事件
    55 mAdapter.setItemClickListener(new MainItemClickListener() { 56 @Override 57 public void onItemClick(View view, String name, String path) { 58 Intent intent = new Intent(getActivity(), MainActivity.class); 59 intent.setData(Uri.parse(path)); 60 startActivity(intent); 61 } 62 });
          //绑定数据集
    63 mRecyclerView.setAdapter(mAdapter); 64 65 return wrapper; 66 } 67 68 69 }

    其中的子布局使用了CardView:

    我设置的东西只有: 

    card_view:cardCornerRadius="4dp"  //设定圆角半径

    card_view:cardElevation="8dp"//设定阴影

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <android.support.v7.widget.CardView
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     xmlns:card_view="http://schemas.android.com/apk/res-auto"
     5     android:background="@drawable/list_item_selector"
     6     android:layout_width="match_parent"
     7     android:layout_height="wrap_content"
     8     card_view:cardCornerRadius="4dp"
        card_view: 9 android:layout_margin="@dimen/card_margin"> 10 <RelativeLayout 11 android:layout_marginTop="16dp" 12 android:layout_marginLeft="16dp" 13 android:layout_marginRight="16dp" 14 android:layout_marginBottom="16dp" 15 android:layout_width="match_parent" 16 android:layout_height="wrap_content"> 17 <ImageView 18 android:maxHeight="100dp" 19 android:layout_marginTop="8dp" 20 android:layout_below="@+id/line_view" 21 android:layout_width="match_parent" 22 android:layout_height="wrap_content" 23 android:id="@+id/paint_img" 24 android:src="@mipmap/ic_launcher" /> 25 <TextView 26 android:id="@+id/paint_name" 27 android:textColor="#000" 28 android:textSize="18sp" 29 android:text="项目名" 30 android:layout_alignParentRight="true" 31 android:singleLine="true" 32 android:layout_width="wrap_content" 33 android:layout_height="wrap_content" /> 34 <TextView 35 android:id="@+id/paint_time" 36 android:text="项目时间" 37 android:textColor="@color/black" 38 android:textSize="18sp" 39 android:singleLine="true" 40 android:layout_width="wrap_content" 41 android:layout_height="wrap_content" /> 42 <View 43 android:id="@+id/line_view" 44 android:background="@color/gray" 45 android:layout_below="@+id/paint_time" 46 android:layout_width="match_parent" 47 android:layout_height="1dp"/> 48 <TextView 49 android:id="@+id/paint_root" 50 android:visibility="invisible" 51 android:layout_width="wrap_content" 52 android:layout_height="wrap_content" /> 53 </RelativeLayout> 54 55 </android.support.v7.widget.CardView>

      这只是第一篇继续使用过程中发现新特性还会更新!

  • 相关阅读:
    字符输入流 FileReader
    字符输出流 FileWriter
    字节流复制文件
    字节输入流 FileInputStream
    彻底弄懂jsonp原理及实现方法
    这三个月,我如何一点点地成长(海康前端实习)
    前端chrome浏览器调试总结
    前端常见的布局方案大全
    总结4种常用排序(快排、选择排序、冒泡排序、插入排序)
    详解JS中DOM 元素的 attribute 和 property 属性
  • 原文地址:https://www.cnblogs.com/lfk-dsk/p/4808823.html
Copyright © 2020-2023  润新知