android - 自定义 listView 按随机顺序显示较少的项目

标签 android listview

我为我的 Android 应用程序制作了一个自定义的膨胀 listView,但 getView() 方法有问题。

public class BinderData extends BaseAdapter {

    private LayoutInflater inflater;
    private ArrayList targetList;
    private ViewHolder holder;
    private Activity nikola;
    private Context context;

    private static ArrayList genres = new ArrayList();

    public BinderData(Activity act, List<Genre> map) {
        targetList = new ArrayList();
        for (int i = 0; i<map.size(); i++){
            Genre genre = map.get(i);
            targetList.add(genre);
            ArrayList<Artist> aList = genre.getArtists();
            for (int j = 0; j<aList.size(); j++){
                targetList.add(aList.get(j));
            }
        }
        this.nikola = act;
        inflater = (LayoutInflater) act
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

这是我的 getView() 方法

public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;

        if (convertView == null){
            ViewableItem item = (ViewableItem)targetList.get(position);
            if (item.isTypeOf().equalsIgnoreCase("genre")){
                vi = inflater.inflate(R.layout.category_row, null);
                holder = new GenreViewHolder();
                ((GenreViewHolder)holder).textViewGenreTitle = (TextView)vi.findViewById(R.id.textViewCategoryTitle);
                String s = ((Genre)item).getTitle();
                holder.setTitle(s);
            }else{
                vi = inflater.inflate(R.layout.list_row, null);
                holder = new ArtistViewHolder();
                ((ArtistViewHolder)holder).textViewArtistName = (TextView)vi.findViewById(R.id.textViewAuthorNameHome);
                String s = ((Artist)item).getArtist();
                holder.setArtistName(s);
            }
            vi.setTag(holder);
        }else{
            holder = (ViewHolder)vi.getTag();
        }

        return vi;
    }

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

http://imgur.com/xbPfGTi - 这是图片

我已经让 targetList 填充了我需要在 listView 中显示的数据。 (在构造函数中) 但问题来了! 列表中的艺术家不断重复,并且类别位置不正确。

有什么想法吗?

最佳答案

您的问题是由于当 convertView != null 时您没有将数据绑定(bind)到行,而是返回被回收到的 convertView你,这就是为什么你看到相同的重复数据。

您需要根据数据类型将数据绑定(bind)到每行的View,如下所示:

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 知道存在不止一种数据类型,以便它知道如何回收行的 View

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

假设我没有犯任何错误,您应该能够复制并粘贴此解决方案。

关于android - 自定义 listView 按随机顺序显示较少的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15844338/

相关文章:

android - 如何在 fragment TAbHost 上添加滑动手势

android - 如何在按钮单击时发送推送通知

android - 是否可以使用 Android sdk 将短信保存在草稿中

java - 如何将 Hashmap 值存储在 ListView 中 LongclickListener 的变量中?

java - 无法使用自定义适配器单击 listview android

android:在 ListView 行内单击按钮播放音频

android - Wifi 启用广播迟到

android - 为什么 css 属性在 android webview 中发生变化

android - 如何使用自定义列表适配器显示 listView 为空

android - 设置listview项目中线性布局的可见性和滚动问题