Android 自定义listView以随机顺序显示较少的项
我已经为我的android应用程序定制了一个膨胀的列表视图,但是getView()方法有问题 我的列表有两种布局。一个用于类别标题,另一个用于该类别下的项目 -这是照片 我已将需要在listView中显示的数据填入targetList。(在构造函数中) 这就是问题所在! 列表中的艺术家不断重复,类别不在正确的位置Android 自定义listView以随机顺序显示较少的项,android,listview,Android,Listview,我已经为我的android应用程序定制了一个膨胀的列表视图,但是getView()方法有问题 我的列表有两种布局。一个用于类别标题,另一个用于该类别下的项目 -这是照片 我已将需要在listView中显示的数据填入targetList。(在构造函数中) 这就是问题所在! 列表中的艺术家不断重复,类别不在正确的位置 有什么想法吗?您的问题是因为在convertView!=null,而是返回回收给您的convertView,这就是您看到相同重复数据的原因 您需要根据数据类型将数据绑定到每行的视图s,
有什么想法吗?您的问题是因为在
convertView!=null,而是返回回收给您的convertView
,这就是您看到相同重复数据的原因
您需要根据数据类型将数据绑定到每行的视图
s,如下所示:
public View getView(int position, View convertView, ViewGroup parent) {
final View row;
boolean isGenreRow = getItemViewType(position) == GENRE_ROW;
// Inflate views if this is a new row
if (convertView == null) {
// Get the right type of view depending on the type of data
if (isGenreRow) {
row = inflater.inflate(R.layout.category_row, null);
holder = new GenreViewHolder();
((GenreViewHolder) holder).textViewGenreTitle = (TextView) row.findViewById(R.id.textViewCategoryTitle);
}
else {
row = inflater.inflate(R.layout.list_row, null);
holder = new ArtistViewHolder();
((ArtistViewHolder) holder).textViewArtistName = (TextView) row.findViewById(R.id.textViewAuthorNameHome);
}
row.setTag(holder);
}
// Otherwise, use the recycled row
else {
row = convertView;
holder = (ViewHolder) row.getTag();
}
// Bind data to views, depending on data type
ViewableItem item = (ViewableItem) targetList.get(position);
if (isGenreRow) {
((GenreViewHolder) holder).setTitle(((Genre) item).getTitle());
}
else {
((ArtistViewHolder) holder).setArtistName(((Artist) item).getArtist());
}
return row;
}
您还必须重写一些其他方法,让BaseAdapter
知道存在多个数据类型,以便它知道如何回收行的视图
private static final int GENRE_ROW = 0;
private static final int ARTIST_ROW = 1;
@Override
public int getItemViewType(int position) {
// Return the row type at the position
ViewableItem item = (ViewableItem) targetList.get(position);
return item.isTypeOf().equalsIgnoreCase("genre") ? GENRE_ROW : ARTIST_ROW;
}
@Override
public int getViewTypeCount() {
// Return the number of row types there are
return 2;
}
假设我没有犯任何错误,您应该能够复制并粘贴此解决方案。您的确切问题是什么?您可以在图片中看到。。。看起来只有5到6个视图被放大了。其他艺术家(其中60人)根本没有展出。。。但是如果我删除这个--if(convertView==null)--一切正常。唯一的问题是内存泄漏,这将使我的应用程序停止后一段时间和一件事。。。这一流行音乐类别不应增加一倍。那一行的位置是错误的,其中一个不应该是流行音乐,它应该是摇滚乐或民谣,或者来自mu TargetList的其他东西首先,如果你的适配器调整了60位艺术家,那么listview将通过滚动显示所有艺术家,如果你的列表视图显示了5或6位艺术家,那么它将显示所有艺术家,第二,对于流行音乐,你必须检查你的xml文件,你们只有一个int格式的文本视图吗?xml的一切都很好…我想我爱你们!!!:)太棒了,很高兴我没有犯任何错误:)。是的,您可以在将数据绑定到视图的区域中添加单击侦听器(我以前已经这样做了)。
public View getView(int position, View convertView, ViewGroup parent) {
final View row;
boolean isGenreRow = getItemViewType(position) == GENRE_ROW;
// Inflate views if this is a new row
if (convertView == null) {
// Get the right type of view depending on the type of data
if (isGenreRow) {
row = inflater.inflate(R.layout.category_row, null);
holder = new GenreViewHolder();
((GenreViewHolder) holder).textViewGenreTitle = (TextView) row.findViewById(R.id.textViewCategoryTitle);
}
else {
row = inflater.inflate(R.layout.list_row, null);
holder = new ArtistViewHolder();
((ArtistViewHolder) holder).textViewArtistName = (TextView) row.findViewById(R.id.textViewAuthorNameHome);
}
row.setTag(holder);
}
// Otherwise, use the recycled row
else {
row = convertView;
holder = (ViewHolder) row.getTag();
}
// Bind data to views, depending on data type
ViewableItem item = (ViewableItem) targetList.get(position);
if (isGenreRow) {
((GenreViewHolder) holder).setTitle(((Genre) item).getTitle());
}
else {
((ArtistViewHolder) holder).setArtistName(((Artist) item).getArtist());
}
return row;
}
private static final int GENRE_ROW = 0;
private static final int ARTIST_ROW = 1;
@Override
public int getItemViewType(int position) {
// Return the row type at the position
ViewableItem item = (ViewableItem) targetList.get(position);
return item.isTypeOf().equalsIgnoreCase("genre") ? GENRE_ROW : ARTIST_ROW;
}
@Override
public int getViewTypeCount() {
// Return the number of row types there are
return 2;
}