Android的RecyclerView

來源:互聯網
上載者:User

標籤:color   pat   adapter   ase   oda   turn   return   項目   子類   

對於剛開始學習Android的小白來說,listview,gridview這些控制項是必須熟悉的,但是熟悉熟練的使用這些控制項並不能代表你就可以完成開發,比如列表的展示,使用listview,

gridview,RecyclerView都是可以的,那麼他們的區別在哪裡呢?最近自己負責的業務就需要用到列表的展示,那麼到底用哪個,都知道RecyclerView是Google出的一個用於展

示大量資料的控制項,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();
}







}



 









 

Android的RecyclerView

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.