无法从适配器中的getView返回两个不同的视图



开发我的第一个应用程序,我试图在列表视图中添加部分到我的元素。所有项目都有一个日期,我想返回一个简单的布局,其中包含一个日期,每次日期的变化。在我的适配器中,我有以下内容:

    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;
}

一切正常,直到我写到最后一行:

return convertView;

给该行添加一个断点,并试图跳过它,会立即抛出某种错误。

现在作为Android和Eclipse的新手,我真的找不到类似于我在Visual Studio中编写。net代码时得到的堆栈跟踪。我所能看到的是,在Eclipse的Debug透视图中打开了一个带有AbsListView.class的选项卡…

有谁能理解我想要达到的目的吗?也许能帮点忙?我看了这个链接,据我所知,他还根据项目类型返回了两个不同的视图:-?

编辑:实现了Streets Of boston答案,并将代码更改为

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

现在它工作了,但在我的列表中滚动FC是我的应用程序

Thanks in advance

你的问题没有提供足够的信息。不过,我会尽力的:-)

如果您返回多个(类型)View (R.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
    }
}

它与视图的回收有关。当convertView != null时,必须确保参数convertView与早先完成的convertView的原始膨胀相匹配。方法getItemViewType确保了这一点。

这里是一个建议的 getView实现:

    convertView的膨胀并不完全由getItemViewType驱动
  • 在第二个if语句中切换if和else (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;
}

我看到问题是关闭的,但是您应该使用相等的方法进行字符串比较,如match.HomeTeam == ""。要了解更多信息,请查看此答案

最新更新