• Android的RecyclerView


    对于刚开始学习Android的小白来说,listview,gridview这些控件是必须熟悉的,但是熟悉熟练的使用这些控件并不能代表你就可以完成开发,比如列表的展示,使用listview,

    gridview,RecyclerView都是可以的,那么他们的区别在哪里呢?最近自己负责的业务就需要用到列表的展示,那么到底用哪个,都知道RecyclerView是谷歌出的一个用于展

    示大量数据的控件,listview只是一个传统的控件,且RecyclerView可以用来代替传统的listview,相比更加强大,在网上查询了大量的资料得出的结论是:

    列表页展示界面如果需要支持动画,需要频繁更新,刷新界面的,建议使用RecyclerView,其它情况两者都OK,但ListView在使用上会更加方便,快捷。若是使用listvie进行

    局部刷新,相信很多童鞋会记得 notifyDataSetChanged() ,我们都知道更新了listview的数据源后,需要调用Adapter的 notifyDataSetChanged()来告诉视图进行 listview 的更

    新,那么它就需要重绘每个Item了,实际上我们并不需要这样繁琐,最典型的例子比如朋友圈的点赞,只需要更新当前被点赞的item,并不需要全部更新,但是 listview  并没

    有提供这样的API,这样RecyclerView出场了。RecyclerView提供了RecyclerView.Adapter来实现刷新单个Item的功能。先说这些,其他的后续再说。下面说一说RecyclerView

    这才是这篇文章的主题。


    RecyclerView登场了。

    RecyclerView的简单使用:

       (1)引用jar包(主要和原项目的jar包冲突),之前用的Android Studio版本是2.2.2的。因为有冲突改用了2.3.3的版本。不知道有没有人遇到,可能我比较奇葩吧

       (2)在布局文件中申明

             <android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>

    (3)在Activity使用
    》RecyclerView mRecyclerView=(RecyclerView) getActivity().findViewById(R.id.rv_box_prod); //找到 RecyclerView(getActivity做个标记,需要着重了解)

    》mRecyclerView.setHasFixedSize(true); //(可选)如果可以确定每个item的高度是固定的,设置这个选项可以提高性能

    //设置布局管理LayoutManager
    LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);

    》mRecyclerView.setItemAnimator(new DefaultItemAnimator()); //设置动画
    ItemAnimator子类用来管理ViewHolder的动画,它必须调用上面的那些方法来进行管理。最后,官方还出了一个他们已经ok了的动画类,可以直接拿来使用的:DefaultItemAnimator()
    GitHub上的动画效果:RecyclerViewItemAnimators

    》mAdapter = new BoxProdAdapter(getActivity(), 0);
    mRecyclerView.setAdapter(mAdapter);

    》mAdapter.setOnItemClickListener(mOnItemClickListener);
    private BoxProdAdapter.OnItemClickListener mOnItemClickListener = new BoxProdAdapter.OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position) {
    showDeleteDialog(position);//删除选中行
    }
    };


    (4)Adapter的创建
    public class BoxProdAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private ArrayList<BoxProdInfo> mDatas = new ArrayList<>();
    private OnItemClickListener mOnItemClickListener;
    private Context mContext;
    private int mSwitchFragment;//记录是哪个界面启动的扫描

         public BoxProdAdapter(Context context, int switchFragment) {
    this.mContext = context;
    mSwitchFragment = switchFragment;
    }
          //创建新View,被LayoutManager所调用
          @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //商品盒子关联,显示的列为:行号,商品编码,盒子条码
    if (mSwitchFragment == 1) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.box_prod_item, parent, false);
    ItemViewHolder viewHolder = new ItemViewHolder(view);
    return viewHolder;
    }
    else if(mSwitchFragment == 2){
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.prod_item, parent, false);
    ItemViewHolder viewHolder = new ItemViewHolder(view);
    return viewHolder;
    }
    //其他列表显示的列为:行号,盒子编码,扫描时间
    else {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.box_item, parent, false);
    ItemViewHolder viewHolder = new ItemViewHolder(view);
    return viewHolder;
    }

     //将数据与界面进行绑定的操作
     @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof ItemViewHolder) {
    BoxProdInfo data = mDatas.get(position);
    //设置显示的数据
    if (mSwitchFragment == 1) {
    ((ItemViewHolder) holder).mLineNo.setText(Integer.toString(data.getLINE_NO()));//int类型的放入需要转换成字符串
    ((ItemViewHolder) holder).mProdCode.setText(data.getPROD_CODE());
    ((ItemViewHolder) holder).mBoxCode.setText(data.getBOX_CODE());
    } else {
    ((ItemViewHolder) holder).mLineNo.setText(Integer.toString(data.getLINE_NO()));//int类型的放入需要转换成字符串
    ((ItemViewHolder) holder).mScanTime.setText(data.getSCAN_TIME());
    ((ItemViewHolder) holder).mBoxCode.setText(data.getBOX_CODE());
    }
    }
    }

    //获取数据的数量
    @Override
    public int getItemCount() {
    return mDatas.size();
    }

    //单击事件
    《1》定义接口
    public interface OnItemClickListener {
    void onItemClick(View view, int position);
    }
    《2》添加接口和设置接口的方法

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.mOnItemClickListener = onItemClickListener;
    }
    《3》在Apater实现onClick
    public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    private TextView mProdCode, mLineNo, mBoxCode, mScanTime;

    public ItemViewHolder(View itemView) {
    super(itemView);
    if (mSwitchFragment == 1) {
    mProdCode = (TextView) itemView.findViewById(R.id.tx_prod_code);
    mLineNo = (TextView) itemView.findViewById(R.id.tx_line_no);
    mBoxCode = (TextView) itemView.findViewById(R.id.tx_box_code);
    } else {
    mScanTime = (TextView) itemView.findViewById(R.id.tx_scan_time);
    mLineNo = (TextView) itemView.findViewById(R.id.tx_line_no);
    mBoxCode = (TextView) itemView.findViewById(R.id.tx_box_code);
    }
    itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
    if (mOnItemClickListener != null) {
    mOnItemClickListener.onItemClick(view, this.getAdapterPosition());
    }
    }
    }
    //添加和移除
    public void addData(BoxProdInfo info) {
    boolean isNotExist = true;
    for (BoxProdInfo i : mDatas) {
    if (i.getBOX_CODE().equals(info.getBOX_CODE())) {
    isNotExist = false;
    break;
    }
    }
    if (isNotExist) {
    info.setLINE_NO(mDatas.size() + 1);
    this.mDatas.add(info);
    this.notifyDataSetChanged();
    }
    }

    public void removeItem(int position) {
    this.mDatas.remove(position);
    for (int i = 0; i < mDatas.size(); i++) {
    mDatas.get(i).setLINE_NO(i + 1);
    }
    this.notifyDataSetChanged();
    }







    }



     



    
    
    
    





  • 相关阅读:
    python学习笔记——拾
    python学习笔记——玖
    Python 实现栈与队列
    Vijos1774 机器翻译 [模拟]
    Vijos1788 第K大 [模拟]
    Python 序列求和
    HDU 2102 A计划 DFS与BFS两种写法 [搜索]
    Python 多组输入
    Python 文件读写
    HDU 2068 RPG错排 [错排公式]
  • 原文地址:https://www.cnblogs.com/1955/p/7357213.html
Copyright © 2020-2023  润新知