2013-02-28 101 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的进一步信息

相关问题