Android的RecyclerView

对于刚开始学习Android的小白来讲,listview,gridview这些控件是必须熟悉的,可是熟悉熟练的使用这些控件并不能表明你就能够完成开发,好比列表的展现,使用listview,html

gridview,RecyclerView都是能够的,那么他们的区别在哪里呢?最近本身负责的业务就须要用到列表的展现,那么到底用哪一个,都知道RecyclerView是谷歌出的一个用于展android

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

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

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

新,那么它就须要重绘每一个Item了,实际上咱们并不须要这样繁琐,最典型的例子好比朋友圈的点赞,只须要更新当前被点赞的item,并不须要所有更新,可是 listview  并没布局

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

这才是这篇文章的主题。学习


 

RecyclerView登场了。动画

RecyclerView的简单使用:this

   (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();
}





}
相关文章
相关标签/搜索