1

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

    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 的选项卡......

任何人都可以理解我想要实现的目标吗?也许能帮上忙?我查看了此链接,据我所知,他还根据项目类型返回两个不同的视图:-?

编辑:实施波士顿街道答案并将代码更改为

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

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

提前致谢

4

2 回答 2

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

它与视图的回收有关。当 时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;
}
于 2013-02-28T15:20:27.387 回答
0

我看到问题已经结束,但是您应该像这样使用 equal 方法进行字符串比较match.HomeTeam == ""。查看此答案以获取更多信息

于 2013-02-28T17:01:23.567 回答