2016-06-20 51 views
-1

我知道回收視圖是新的,但我想知道2個代碼在列表視圖中有什麼區別。我已經嘗試過很多搜索,但沒有得到具體的答案。我知道第一個速度比第二個速度快,因爲內存消耗,但爲什麼第二個代碼很慢,那麼第一個內部進程是什麼,任何一個內部進程都可以。Listview適配器的2代碼有什麼區別getView方法

這是第一代碼

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 


final HashMap<String ,String > item = lst.get(position); 
      ViewHolderItem viewHolder; 
      if (convertView == null) { 
       convertView = mInflater.inflate(R.layout.shadow_request_row, parent, false); 

      viewHolder = new ViewHolderItem(); 
      viewHolder.title = (TextView)convertView.findViewById(R.id.item_name); 
      viewHolder.msg = (TextView)convertView.findViewById(R.id.message); 

      convertView.setTag(viewHolder); 
     }else{ 
      viewHolder = (ViewHolderItem) convertView.getTag(); 
     } 
     viewHolder.title.setText(item.get(Const.USERNAME)); 
     viewHolder.msg.setText(item.get(Const.GET_MESSAGE)); 
     return convertView; 
    } 

這是第二代碼

@Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 

final HashMap<String ,String > item = lst.get(position); 
      ViewHolderItem viewHolder; 
      if (convertView == null) { 
       convertView = mInflater.inflate(R.layout.shadow_request_row, parent, false); 

      viewHolder = new ViewHolderItem(); 
      viewHolder.title = (TextView)convertView.findViewById(R.id.item_name); 
      viewHolder.msg = (TextView)convertView.findViewById(R.id.message); 

     } 
     viewHolder.title.setText(item.get(Const.USERNAME)); 
     viewHolder.msg.setText(item.get(Const.GET_MESSAGE)); 
     return convertView; 
    } 

回答

0

第二個例子是缺少有關保存viewHolder爲創建的視圖的標記如果視圖是部分如果視圖已經存在,只需要充氣並重新使用viewHolder

0

列表查看項目被重新創建,只要它想要。 (當你上下滾動時會發生這種情況)。每當ListView需要重新創建一個項目時,它會調用具有所需位置的適配器的getView()。在getView()方法中,您有邏輯來生成該位置所需的項目View

您使用的方法findViewById()在XML內部找到一個View,屬於CPU廣泛。如果您的XML包含很長的兒童序列,並且getView()包含很多findViewById()調用,則可能會看到相當大的延遲。

這是ViewHolder的用處。 ViewHolder是一個可以容納View項目的類。您可以使用已創建的ViewHolder對象,而不是每次調用findViewById()

要利用此功能,您必須保存與特定位置關聯的ViewHolder對象。你這樣做。

ViewHolder viewHolder; 
if(convertView==null){ 
    //the view is created for the first time 
    //you have to make the View HOlder object here 
    viewHOlder=new ViewHOlder(convertView); 
    //ViewHOlder constructor can find the required view elements and store it in variables 
    //now you have to save this View Holder object for future reference 
    //you save it as a tag 
    convertView.setTag(viewHolder); 
} 

現在您已經爲特定物品位置定義了視圖持有人。以下是如何重新使用它。 當ListView適配器重新使用它時,給予getItem()convertView不爲空。因此重新使用發生在上述ifelse聲明中。

else{ 
    //you already have a pre created View holder. Retrieve it. 
    viewHOlder=(ViewHolder)convertView.getTag(); 
    //now you can get access to your View elements easily 
} 

在你的第二個例子中,你創建了ViewHOlder,但你永遠不會使用它。所以它沒有改善。

+0

感謝您的非常詳細的答覆馬利斯Lakshan,但我對這個視頻的查詢請觀看它在這個視頻中,他們說這兩個代碼是正確的,但我不明白爲什麼第一個更快。請看這一個。 https://www.youtube.com/watch?v=wDBM6wVEO70 – Nitish