Android的RecyclerView

来源:http://www.cnblogs.com/mff520mff/archive/2017/08/14/7357213.html
-Advertisement-
Play Games

對於剛開始學習Android的小白來說,listview,gridview這些控制項是必須熟悉的,但是熟悉熟練的使用這些控制項並不能代表你就可以完成開發,比如列表的展示,使用listview, gridview,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();
}







}



 










 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文為純理論文章,沒有 Demo,沒有配圖,可能會略微枯燥。 大家都知道,position:fixed 在日常的頁面佈局中非常常用,在許多佈局中起到了關鍵的作用。它的作用是: position:fixed 的元素將相對於屏幕視口(viewport)的位置來指定其位置。並且元素的位置在屏幕滾動時不會改 ...
  • 一、在ES5中存在6中數據類型 基本數據類型:undefined,null,boolean,string ,number 引用數據類型:Object 在ES6中引入新的數據類型(第七種):Symbol 二、作為屬性名的Symbol。 ...
  • Spinner使用一 一、使用方法 1、在layout中創建Spinner控制項 <Spinner android:id="@+id/spinner1" android:layout_width="match_parent" android:layout_height="wrap_content" / ...
  • 首先你要花點時間針對objective-c語言的學習;畢竟這個是iOS開發的基礎(你也可以嘗試用Swift,但此項目只是針對OC),編程套路其實都是差不多,多寫多想多實踐;關於環境的搭建就不在本文進行介紹,這部分內容可以自行百度或谷歌,都有相應的說明; 對於一個剛入門總是希望有個完整的項目可以直接運 ...
  • 原生的,也不知道會不會用到,以前的筆記。 文件夾管理 1、拿到文件管理者單例 2、使用管理者創建文件夾 3、創建文件 4、讀取文件信息 5、讀取文件返回的字典信息 6、文件讀取 6-1)、方法1: 6-2)、方法2: 7、文件移動(剪切、重命名) 8、文件複製 9、文件刪除 文件操作 ...
  • iOS雖然也有SQL,不過用得少(至少我目前是這樣)。大數據直接丟給後臺,小的用Plist足矣。 再退一步,有FMDB,原生的也用得少了。 下麵是之前學SQL時候的筆記。 1、創建 1-1)、打開: 資料庫指針、保存地址 1-2)、創建: 資料庫指針、創建指令、錯誤指令 1-3)、關閉: 資料庫指針 ...
  • 另一個大嬸寫的關於抽屜的博文: http://blog.csdn.net/lu1024188315/article/details/73608616 今天參考大灰狼得博客,好好得總結一下navigation得用法。以前總是看官方文檔,但理解得不太透測。 一、開源庫介紹 今年1月份,新開源的React ...
  • 今天在android studio上打包項目時,遇到了Error:Execution failed for task ':app:transformClassesWithDexForRelease這麼個錯誤,記得之前也遇到過這種問題,卻如何想不起怎麼解決的,只好再次在網上查資料,總算是解決了 這個問 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...