2013-02-28 18 views
1

開發我的第一個應用程序我試圖在列表視圖中添加部分到我的元素。所有項目都有一個日期,我希望每次更改日期時都返回一個包含日期的簡單佈局。在我的適配器,我有以下:無法從適配器中的getView返回兩個不同的視圖

return convertView; 

添加一個破發點,以該行並試圖一步通過它立即引發了一些:直到我到達最後一行

public View getView(int position, View convertView, ViewGroup parent) { 
    Match match = matchArrayList.get(position); 
    Calendar matchTime = match.getDate(); 
    SimpleDateFormat date = new SimpleDateFormat("dd-MM-yyyy"); 
    SimpleDateFormat time = new SimpleDateFormat("HH:mm"); 
    String sDate = date.format(matchTime.getTime()); 
    SeparatorHolder separatorHolder = null; 
    MatchHolder matchHolder = null; 

    if (convertView == null) { 
     if (!sDate.equals(_lastDate)) { 
      convertView = inflator.inflate(R.layout.date_separator, null); 
      separatorHolder = new SeparatorHolder(); 
      separatorHolder.Date = (TextView) convertView.findViewById(R.id.date); 
      convertView.setTag(separatorHolder); 
     } else { 
      convertView = inflator.inflate(R.layout.match_layout, null); 
      matchHolder = new MatchHolder(); 
      matchHolder.Time = (TextView) convertView.findViewById(R.id.time); 
      matchHolder.HomeTeam = (TextView) convertView.findViewById(R.id.homeTeam); 
      matchHolder.AwayTeam = (TextView) convertView.findViewById(R.id.awayTeam); 
      matchHolder.HomeTeamImage = (ImageView) convertView.findViewById(R.id.homeTeamImageView); 
      matchHolder.AwayTeamImage = (ImageView) convertView.findViewById(R.id.awayTeamImageView); 
      matchHolder.TournamentImage = (ImageView) convertView.findViewById(R.id.tournamentImageView); 
      matchHolder.TVChannelImage = (ImageView) convertView.findViewById(R.id.tvChannelImageView); 
      convertView.setTag(matchHolder); 
     } 
    } 
    else { 
     if (!sDate.equals(_lastDate)) 
      matchHolder = (MatchHolder) convertView.getTag(); 
     else 
      separatorHolder = (SeparatorHolder) convertView.getTag(); 
    } 

    if (!sDate.equals(_lastDate)) { 
     _lastDate = sDate; 
     separatorHolder.Date.setText(sDate); 
    } else { 
     UrlImageViewHelper.setUrlDrawable(matchHolder.TournamentImage, match.getTournamentImage()); 
     UrlImageViewHelper.setUrlDrawable(matchHolder.HomeTeamImage, match.getHomeTeamImage()); 
     matchHolder.HomeTeam.setText(match.getHomeTeam()); 
     UrlImageViewHelper.setUrlDrawable(matchHolder.AwayTeamImage, match.getAwayTeamImage()); 
     matchHolder.AwayTeam.setText(match.getAwayTeam()); 
     matchHolder.Time.setText(time.format(matchTime.getTime())); 
     UrlImageViewHelper.setUrlDrawable(matchHolder.TVChannelImage, match.getTVChannelImage()); 
    } 

    return convertView; 
} 

一切工作就好了有點錯誤。

現在剛剛成爲Android和Eclipse的新手,我實際上找不到類似於在Visual Studio中編寫.Net時獲得的堆棧跟蹤。我只能看到在Eclipse的Debug透視圖中打開了一個帶有AbsListView.class的選項卡...

任何人都可以對我想實現的目標有所瞭解嗎?也許幫助一下?我看着this link,據我所知,他還根據物品類型返回了兩個不同的視圖: - ?

編輯: 實施波士頓答案的街道,並改變了代碼

@Override 
public int getItemViewType(int position) { 
    Match match = matchArrayList.get(position); 
    if (match.HomeTeam == "") { 
     return 0; 
    } 
    else { 
     return 1; 
    } 
} 

現在,它的工作原理,但提前在我的名單FC的我的應用程序滾動

感謝

回答

12

沒有足夠的您的問題中的信息。但是,我會盡我所能:-)

如果返回多個(類)ViewR.layout.date_separatorR.layout.match_layout),你必須實現適配器的getViewTypeCountgetItemViewType方法:

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

@Override 
public int getItemViewType(int position) { 
    Match match = matchArrayList.get(position); 
    ... 
    ... 
    if (!sDate.equals(_lastDate)) { 
     return 0; // matches R.layout.date_separator 
    } 
    else { 
     return 1; // matches R.layout.match_layout 
    } 
} 

它與Views的回收有關。當convertView != null時,您必須確保參數convertView與之前完成的convertView的原始通貨膨脹率相匹配。方法getItemViewType可以確保。

這裏是一個建議getView實現:

  • convertView的膨脹不完全由getItemViewType
  • 從動交換if和else在第二if語句(SeparatorHolderMatchHolder在被切換呼叫convertView.getTag

public View getView(int position, View convertView, ViewGroup parent) { 
    Match match = matchArrayList.get(position); 
    Calendar matchTime = match.getDate(); 
    SimpleDateFormat date = new SimpleDateFormat("dd-MM-yyyy"); 
    SimpleDateFormat time = new SimpleDateFormat("HH:mm"); 
    String sDate = date.format(matchTime.getTime()); 
    SeparatorHolder separatorHolder = null; 
    MatchHolder matchHolder = null; 

    int itemType = getItemViewType(position); 
    if (convertView == null) { 
    if (itemType == 0) { 
     convertView = inflator.inflate(R.layout.date_separator, null); 
     separatorHolder = new SeparatorHolder(); 
     separatorHolder.Date = (TextView) convertView.findViewById(R.id.date); 
     convertView.setTag(separatorHolder); 
    } else { 
     convertView = inflator.inflate(R.layout.match_layout, null); 
     matchHolder = new MatchHolder(); 
     matchHolder.Time = (TextView) convertView.findViewById(R.id.time); 
     matchHolder.HomeTeam = (TextView) convertView.findViewById(R.id.homeTeam); 
     matchHolder.AwayTeam = (TextView) convertView.findViewById(R.id.awayTeam); 
     matchHolder.HomeTeamImage = (ImageView) convertView.findViewById(R.id.homeTeamImageView); 
     matchHolder.AwayTeamImage = (ImageView) convertView.findViewById(R.id.awayTeamImageView); 
     matchHolder.TournamentImage = (ImageView) convertView.findViewById(R.id.tournamentImageView); 
     matchHolder.TVChannelImage = (ImageView) convertView.findViewById(R.id.tvChannelImageView); 
     convertView.setTag(matchHolder); 
    } 
    } 
    else { 
     if (itemtype == 0) 
      separatorHolder = (SeparatorHolder) convertView.getTag(); 
     else 
      matchHolder = (MatchHolder) convertView.getTag(); 
    } 

    if (itemType == 0) { 
    _lastDate = sDate; 
    separatorHolder.Date.setText(sDate); 
    } else { 
    UrlImageViewHelper.setUrlDrawable(matchHolder.TournamentImage, match.getTournamentImage()); 
    UrlImageViewHelper.setUrlDrawable(matchHolder.HomeTeamImage, match.getHomeTeamImage()); 
    matchHolder.HomeTeam.setText(match.getHomeTeam()); 
    UrlImageViewHelper.setUrlDrawable(matchHolder.AwayTeamImage, match.getAwayTeamImage()); 
    matchHolder.AwayTeam.setText(match.getAwayTeam()); 
    matchHolder.Time.setText(time.format(matchTime.getTime())); 
    UrlImageViewHelper.setUrlDrawable(matchHolder.TVChannelImage, match.getTVChannelImage()); 
    } 

    return convertView; 
} 
+0

感謝您的超級快速和絕對現貨答案:-)現在它的工作! – CJe 2013-02-28 15:27:38

+0

沒問題:)我有點擔心'_lastDate'。它可能會搞砸了,因爲它使得getItemViewType的返回值不僅取決於'position'的值,而且取決於'_lastDate'的值。如果這與'getView(...)'中發生的情況不完全匹配,您仍可能遇到問題。 – 2013-02-28 15:29:56

+0

只要渲染列表就可以工作,但只要我開始向下滾動,它就會關閉。對此有何想法?它工作得很好,只有一個視圖類型... – CJe 2013-02-28 15:53:39

0

我看到的問題是封閉的,但你應該使用相同的方法對這樣match.HomeTeam == ""字符串比較。 看看這個answer的進一步信息

相關問題