2013-10-14 45 views
1

我膨脹兩個不同的佈局的ListView。一切工作,直到我開始向下滾動2個不同的佈局開始隨機應用。我在這裏跟着其他的例子,但我不能得到它的工作。有什麼建議麼?ListView視圖回收與CustomAdapter

public class CustomAdapter extends BaseAdapter { 

    Date date = new Date(); 
    private OfferList[] offers; 
    private String nameCompare = ""; 

    CustomAdapter (OfferList[] offers, FetchItemsTask fetchItemsTask) { 
     this.offers = offers; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent){ 
     ViewHolder holder = null; 
     LayoutInflater inflater = getLayoutInflater();   
     if (convertView == null) { 
      holder = new ViewHolder(); 
      if (nameCompare.equalsIgnoreCase(offers[position].getCustomerName())) { 
       convertView = inflater.inflate(R.layout.list_offer_group, null); 
      } 
      else { 
       nameCompare = offers[position].getCustomerName(); 
       convertView = inflater.inflate(R.layout.list_offer, null); 
      } 
      holder.name = (TextView) convertView.findViewById(R.id.name); 
      holder.color = (TextView) convertView.findViewById(R.id.color_stock); 
      holder.time = (TextView) convertView.findViewById(R.id.time); 
      holder.offerStatus = (TextView) convertView.findViewById(R.id.offer_status); 

      convertView.setTag(holder); 

     } 
     else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.name.setText(offers[position].getName()); 
     holder.carStockColor.setText(offers[position].getYear() + " " + offers[position].getVehicleMake()); 
     java.util.Date time1 = new java.util.Date(Long.parseLong(offers[position].getModified())); 
     holder.time.setText(time1.toString().substring(0, 11) + " | "); 
     holder.offerStatus.setText(offers[position].getStatus()); 
     return convertView; 

    } 

public class ViewHolder { 
     TextView name; 
     TextView color; 
     TextView time; 
     TextView offerStatus; 
    } 
} 

回答

4

你需要重寫以下方法:

https://developer.android.com/reference/android/widget/Adapter.html#getViewTypeCount() https://developer.android.com/reference/android/widget/Adapter.html#getItemViewType(int)

這將讓列表視圖知道你有多少種看法已經和哪個位置是哪種類型的。這將防止listview將不正確的convertview類型傳遞給getView方法。

編輯:

讓我們退後一步。你看到這個問題的原因是ListView將不正確的convertView傳遞給你的getView()方法。默認的getViewTypeCount()返回1,所以listView假定你只有一種視圖類型。您正在爲您的行使用兩種類型的視圖:R.layout.list_offer_group和R.layout.list_offer。當convertView不爲null時,您不檢查哪些佈局convertView是 - 在某些情況下,它將是不正確的佈局。

爲了解決這個問題:

覆蓋getViewTypeCount返回2,因爲你有兩種不同的類型。重寫getItemViewType以使用您的組/非組邏輯

public int getItemViewType(int position) { 
    if (nameCompare.equalsIgnoreCase(offers[position].getCustomerName())) { 
    return 0; 
    } else { 
    return 1; 
    } 
} 

現在,此組返回0,非組返回1。然後我們就可以在getView使用getItemViewType(),以確定哪些查看我們正在使用,所以:

 if (nameCompare.equalsIgnoreCase(offers[position].getCustomerName())) { 
      convertView = inflater.inflate(R.layout.list_offer_group, null); 
     } 
     else { 
      nameCompare = offers[position].getCustomerName(); 
      convertView = inflater.inflate(R.layout.list_offer, null); 
     } 

變爲:

 if (getItemViewType(position) == 0) { 
      convertView = inflater.inflate(R.layout.list_offer_group, null); 
     } 
     else { 
      nameCompare = offers[position].getCustomerName(); 
      convertView = inflater.inflate(R.layout.list_offer, null); 
     } 

這應該可以解決您的行爲,因爲現在的ListView知道你有2種視圖類型( getViewTypeCount)以及列表中的哪些行是哪種類型(getItemViewType)。它將不再將類型組的convertView傳遞給getView調用,用於非組類型的行,反之亦然。

+0

類型計數將返回2,因爲我使用2個佈局。 getItemViewType如何在我的情況下工作? – ono

+0

在你的情況下,根據視圖類型返回0或1。 – fasteque

+0

所以我不需要改變我的getView()方法?只實施其他兩個? – ono