2016-11-22 129 views
0

的佈局,我試圖設置不同的佈局資源,使用此代碼我的第一個列表項元素:設置第一ListView項

int type; 
@Override 
public int getItemViewType(int position) { 

    if(position==0) { 
     type = R.layout.queue_item_next; 
    } else { 
     type = R.layout.queue_item; 
    } 

    return type; 
} 


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

    if(convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = (View) inflater.inflate(getItemViewType(position), parent, false); 
    } 

此代碼然而可與一些意外行爲。出於某種原因,ListView的最後一個元素也被設置爲具有此替代佈局,我不知道爲什麼。

什麼可能導致這種情況發生?

感謝。

+0

也許是因爲''convertView被重用。刪除if條件並檢查它是否有效? – Sanjeet

+0

我並不百分百確定,但我認爲這與查看回收有關。您目前檢查convertView是否爲空,但我認爲您還必須檢查convertView的當前類型。您可以將其存儲在convertView的標記中以執行此檢查 – 0xDEADC0DE

+0

但未添加對convertView的檢查將增加內存當數量要顯示的項目很大時,違反回收視圖的概念。 – Swapnil

回答

0

因爲您正在使用if(convertView == null) {} 這意味着如果以前的視圖在內存中可用,其他人創建一個新視圖。所以,有時滾動快/慢取決於可用的手機資源。

來解決這個問題不檢查if(convertView == null)

使用這樣

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = (View) inflater.inflate(getItemViewType(position), parent, false); 
    } 
2

問題即將由於getItemViewType()被返回的值大於視圖類型的數量。你可以使用波紋管代碼對我來說工作得很好。

@Override 
    public int getItemViewType(int position) { 

     if(position==0) { 
      return 0; 
     } 
     return 1; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 2; 
    } 

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

     if(convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      int type = getItemViewType(position); 
     if(type == 0) 
      convertView = (View) inflater.inflate(R.layout.first_layout, parent, false); 
     else 
     convertView = (View) inflater.inflate(R.layout.second_layout, parent, false); 
     } 
} 

注:如果只有第一種觀點是不同的,那麼最好的選擇是使用使用headerView使用功能listview.addHeaderView()函數這個link