开发我的第一个应用程序,我试图在列表视图中添加部分到我的元素。所有项目都有一个日期,我想返回一个简单的布局,其中包含一个日期,每次日期的变化。在我的适配器中,我有以下内容:
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_separator
或R.layout.match_layout
),您必须实现适配器的getViewTypeCount
和getItemViewType
方法:
@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
实现:
- 在第二个if语句中切换if和else (
SeparatorHolder
和MatchHolder
在调用convertView.getTag
时被切换)
convertView
的膨胀并不完全由getItemViewType
驱动.
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 == ""
。要了解更多信息,请查看此答案