ListView使用、ListView優化和遇到的問題

来源:http://www.cnblogs.com/wenwei1/archive/2017/07/31/7261082.html
-Advertisement-
Play Games

1.先寫遇到的問題: a.ListView只顯示一個item。 listview只顯示一個item,並且做了listview的點擊事件監聽列印 Bean 對象的屬性和哈希值,發現只有顯示的那個 Bean 對象有屬性值,其他item顯示的 Bean 對象屬性值為null,但是 Bean對象有唯一哈希值 ...


1.先寫遇到的問題:

a.ListView只顯示一個item。

listview只顯示一個item,並且做了listview的點擊事件監聽列印 Bean 對象的屬性和哈希值,發現只有顯示的那個 Bean 對象有屬性值,其他item顯示的 Bean 對象屬性值為null,但是 Bean對象有唯一哈希值,說明 Bean 對象成功創建了,但是是什麼原因導致其他屬性值為空的呢?經過檢查發現。每個對象是創建出來了,創建了第二個對象時,本來用第二個對象去引用屬性值,結果用了第一個去引用屬性值。

錯誤代碼:

 1 Beauty beauty = new Beauty();
 2     beauty.age = "20";
 3     beauty.name = "西施";
 4     beauty.icon = mContext.getResources().getDrawable(R.drawable.a, null);
 5     arraylist.add(beauty);
 6 
 7     Beauty beauty1 = new Beauty();
 8     beauty.age = "18";
 9     beauty.name = "貂蟬";
10     beauty.icon = mContext.getResources().getDrawable(R.drawable.b, null);
11     arraylist.add(beauty1);

 

 正確為:

 1  Beauty beauty = new Beauty();
 2     beauty.age = "20";
 3     beauty.name = "西施";
 4     beauty.icon = mContext.getResources().getDrawable(R.drawable.a, null);
 5     arraylist.add(beauty);
 6 
 7     Beauty beauty1 = new Beauty();
 8     beauty1.age = "18";
 9     beauty1.name = "貂蟬";
10     beauty1.icon = mContext.getResources().getDrawable(R.drawable.b, null);
11     arraylist.add(beauty1);

 

 b.只能顯示一頁,滑動lLIstView時,出現了ViewHolder空指針問題。

優化自定義adapter的getView()裡面的FindViewById()時,從view里獲取存儲的ViewHolder對象寫成了局部對象,當滑動listview再次獲取ViewHolder時,由於是局部對象,獲取不到報空指針。

 1 public View getView(int position, View convertView, ViewGroup parent) {
 2 
 3         View view = null;
 4         ViewHolder viewholder = null;
 5 
 6         if (convertView != null) {
 7             view = convertView;
 8             viewholder = (ViewHolder) view.getTag();//從view里獲取存儲的ViewHolder,寫成了局部對象。
 9         } else {
10             LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
11             view = layoutInflater.inflate(item, parent, false);
12 
13             //每次調用getView 都會執行FindViewById所以繼續優化。
14             viewholder = new ViewHolder();
15             viewholder.viewHolderImageview= (ImageView) view.findViewById(R.id.IV_imageview);
16             viewholder.viewHolderTextview_1 = (TextView) view.findViewById(R.id.TV_age);
17             viewholder.viewHolderTextview_2 = (TextView) view.findViewById(R.id.TV_name);
18             view.setTag(viewholder);//將viewholder存儲在view中
19         }
20 }

 

 

2.自定義ListView的使用。

a.先把Context賦值為全局變數(後面會用到),在獲取XML中的listview的ID。

b.創建ArrayList和Bean對象,並用ArrayList封裝Bean對象。

c.創建Adapter,繼承BaseAdapter。

d.listview設置顯示的adapter。

e.設置listview的監聽事件,實現 AdapterView.OnItemClickListener。

 1  protected void onCreate(Bundle savedInstanceState) {
 2         super.onCreate(savedInstanceState);
 3         setContentView(R.layout.activity_main);
 4         mContext = this;
 5 
 6         lv_1=(ListView)findViewById(R.id.lv_1);
 7         ArrayList<Beauty> arraylist= BeautyUtlis.getAllBeauty(mContext);
 8 
 9 
10         MyAdapter myadapter=new MyAdapter(mContext,R.layout.item_1,arraylist);
11         lv_1.setAdapter(myadapter);
12 
13         //點擊事件
14         lv_1.setOnItemClickListener(this);
15 
16     }

 

 

 

 

b.通過ArrayList封裝Bean對象。

   創建Bean。

 1 public class Beauty {
 2     public String age;
 3     public String name;
 4     public Drawable icon;
 5 
 6     public Beauty() {
 7     }
 8 
 9     public Beauty(String age, String name, Drawable icon) {
10         this.age = age;
11         this.name = name;
12         this.icon = icon;
13     }
14 
15     public String getName() {
16         return name;
17     }
18 
19     public void setName(String name) {
20         this.name = name;
21     }
22 
23     public String getAge() {
24         return age;
25     }
26 
27     public void setAge(String age) {
28         this.age = age;
29     }
30 
31     public Drawable getIcon() {
32         return icon;
33     }
34 
35     public void setIcon(Drawable icon) {
36         this.icon = icon;
37     }
38 }

 

 創建ArrayList集合用於封裝Bean。迴圈是為了顯示更多條目。

 1 public class BeautyUtlis {
 2 
 public static ArrayList<Beauty> getAllBeauty(Context mContext) {
 4 
 5         ArrayList<Beauty> arraylist = new ArrayList<>();
 6 
 7 for(int i=0;i<3;i++) {
 8     Beauty beauty = new Beauty();
 9     beauty.age = "20";
10     beauty.name = "西施";
11     beauty.icon = mContext.getResources().getDrawable(R.drawable.a, null);
12     arraylist.add(beauty);
13 
14     Beauty beauty1 = new Beauty();
15     beauty1.age = "18";
16     beauty1.name = "貂蟬";
17     beauty1.icon = mContext.getResources().getDrawable(R.drawable.b, null);
18     arraylist.add(beauty1);
19 
20 
21     Beauty beauty2 = new Beauty();
22     beauty2.age = "22";
23     beauty2.name = "楊貴妃";
24     beauty2.icon = mContext.getResources().getDrawable(R.drawable.c, null);
25     arraylist.add(beauty2);
26 
27 
28     Beauty beauty3 = new Beauty();
29     beauty3.age = "20";
30     beauty3.name = "阿科";
31     beauty3.icon = mContext.getResources().getDrawable(R.drawable.d, null);
32     arraylist.add(beauty3);
33    
34 }
35         return arraylist;
36     }
37 }

 

 

 

 

 

 c.創建Adapter,繼承BaseAdapter,通過自定義的構造方法傳Context,item  ID,ArrayList封裝的Bean對象。

 1 public class MyAdapter extends BaseAdapter {
 2 
 3 
 4     private final Context mContext;
 5     private final ArrayList<Beauty> arraylist;
 6     private final int item;
 7 
 8 
 9     public MyAdapter(Context mContext, int item_1, ArrayList<Beauty> araylist) {
10         this.mContext = mContext;
11         this.arraylist = araylist;
12         this.item = item_1;
13     }
14 
15     //listview 顯示多少個條目
16     @Override
17     public int getCount() {
18         return arraylist.size();
19     }
20 
21 
22     //根據postiion獲取條目對應的Bean數據
23     @Override
24     public Object getItem(int position) {
25         return arraylist.get(position);
26     }
27 
28     //獲取position條目的ID
29     @Override
30     public long getItemId(int position) {
31         return position;
32     }
33 
34 
35     /**
36      * getview:告訴listview條目上顯示的內容;返回一個View對象作為條目上的內容展示,該方法返回什麼樣的view,Listview的條目上就顯示什麼樣的view。38      * //屏幕上每顯示一個條目getview方法就會被調用一次;
convertView:曾經使用過的view對象,可以被重覆使用,使用前要判斷。
39 **/ 40 @Override 41 public View getView(int position, View convertView, ViewGroup parent) { 42 43 View view = null; 44 ViewHolder viewholder = null; 45
//判斷convertView是否為空,為空創建新的View,不為空則復用被推出頁面外的view 46 if (convertView != null) { 47 view = convertView; 48 viewholder = (ViewHolder) view.getTag();//從view里獲取存儲的ViewHolder 49 } else { 50 LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 51 view = layoutInflater.inflate(item, parent, false); 52 53 //每次調用getView 都會執行FindViewById所以繼續優化。 54 viewholder = new ViewHolder(); 55 viewholder.viewHolderImageview= (ImageView) view.findViewById(R.id.IV_imageview); 56 viewholder.viewHolderTextview_1 = (TextView) view.findViewById(R.id.TV_age); 57 viewholder.viewHolderTextview_2 = (TextView) view.findViewById(R.id.TV_name); 58 view.setTag(viewholder);//將viewholder存儲在view中 59 } 60 //獲取Bean對象 61 62 Beauty beauty = arraylist.get(position); 63 64 viewholder.viewHolderImageview.setImageDrawable(beauty.getIcon()); 65 viewholder.viewHolderTextview_1.setText(beauty.getAge()); 66 viewholder.viewHolderTextview_2.setText(beauty.getName()); 80 return view; 81 } 82 83 //優化FindVIewById 84 class ViewHolder { 85 ImageView viewHolderImageview; 86 TextView viewHolderTextview_1; 87 TextView viewHolderTextview_2; 88 } 89 }

 

 

 

 

d.listview設置顯示的adapter。

1  lv_1.setAdapter(myadapter);

 

 

 

 

e.設置listview的監聽事件,實現 AdapterView.OnItemClickListener。簡單列印。

 1  {
 2 .........
 3 lv_1.setOnItemClickListener(this);
 4 
 5  }
 6 
 7     @Override
 8     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 9         //獲取條目對應的對象
10         Beauty beauty = (Beauty) parent.getItemAtPosition(position);
11 Toast.makeText(mContext,"點擊了第"+position+"位置,"+"姓名叫:"+beauty.name+",年齡是:"+beauty.age,Toast.LENGTH_LONG).show(); 12 13 }

 


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

-Advertisement-
Play Games
更多相關文章
  • activity之間通過全局變數傳遞數據 一、簡介 Application域中的onCreate方法是Android程式的入口,Android程式運行的時候就自動載入Application的對象,感覺Main方法應該是封裝在這個裡面的。 二、 ...
  • 在activity之間通過靜態變數傳遞數據 一、簡介 主要作用:解決intent不能傳遞非序列化的對象 評價:簡單方便,但是容易發生記憶體泄露,所以要及時回收記憶體 二、具體操作 1、在傳輸數據的頁面弄好數據,傳遞給接收數據的頁面 Obj1 obj=new Obj1("fry",22); Activit ...
  • 跳轉到AppStore評分,有兩種方法: 一種是跳出應用,跳轉到AppStore,進行評分; 另一種是在應用內,內置AppStore進行評分。 PS:appID在https://itunesconnect.apple.com中創建應用即可在應用界面獲得 1.跳出應用,跳轉到AppStore,進行評分 ...
  • 在activity之間傳遞數據 一、簡介 二、通過intent傳遞數據 1、在需要傳數據的界面調用 intent.putExtra("data1", "我是fry");方法 //前面是鍵,後面是值,這個是string 2、在需要接受數據的界面調用bundle獲取傳遞過來的數據即可 Bundle bu ...
  • 序列化 一、serializable和parcelable區別 serializable是java裡面的序列化,parcelable是android裡面的序列化。 serializable序列化之後的文件是放在本地磁碟的,便於持久存儲; parcelable序列化之後的文件是放在記憶體的,速度很快; ...
  • android項目1:打電話 一、效果圖 二、步驟 1、畫好主界面 /call/res/layout/activity_main.xml 2、編好代碼 com.fry.call_1.MainActivity 3、設置好許可權 /call/AndroidManifest.xml ...
  • 一,效果圖。 二,工程圖。 三,代碼。 ViewController.m #import "ViewController.h" #import "MBProgressHUD+MJ.h" @interface ViewController () @end @implementation ViewCon ...
  • Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [nan 40] 棧信息列印如下: "解決方法:" 意思是說程式崩潰是CALayer ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...