Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 自定义listView以随机顺序显示较少的项_Android_Listview - Fatal编程技术网

Android 自定义listView以随机顺序显示较少的项

Android 自定义listView以随机顺序显示较少的项,android,listview,Android,Listview,我已经为我的android应用程序定制了一个膨胀的列表视图,但是getView()方法有问题 我的列表有两种布局。一个用于类别标题,另一个用于该类别下的项目 -这是照片 我已将需要在listView中显示的数据填入targetList。(在构造函数中) 这就是问题所在! 列表中的艺术家不断重复,类别不在正确的位置 有什么想法吗?您的问题是因为在convertView!=null,而是返回回收给您的convertView,这就是您看到相同重复数据的原因 您需要根据数据类型将数据绑定到每行的视图s,

我已经为我的android应用程序定制了一个膨胀的列表视图,但是getView()方法有问题

我的列表有两种布局。一个用于类别标题,另一个用于该类别下的项目

-这是照片

我已将需要在listView中显示的数据填入targetList。(在构造函数中) 这就是问题所在! 列表中的艺术家不断重复,类别不在正确的位置


有什么想法吗?

您的问题是因为在
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;
}