滚动列表视图时数据解释错误

Bad data interpretation when scrolling of Listview

我用自定义 ListView 编写了代码。在 ListView 中,我有一个在某些情况下隐藏的 textView。当我向下滚动视图时,一切正常。但是,当我向上滚动视图时,所有 textVie 都被隐藏了。我知道这与为元素设置标签有关。我尝试了不同方面的示例,但是,textView 总是消失:( 我的自定义 ArrayAdapter 代码:

class WallpapersListAdapter extends ArrayAdapter<Wallpaper> {
    private List<Wallpaper> wallpapersContainer;
    private ImageLoader imageLoader;
    private DisplayImageOptions imageLoaderOptions;

public WallpapersListAdapter(Context context, List<Wallpaper> wallpapersContainer) {
    super(context, R.layout.wallpaper_view, wallpapersContainer);
    this.wallpapersContainer = wallpapersContainer;
    setImageLoaderOptions();
}

private void setImageLoaderOptions() {
    imageLoaderOptions = new DisplayImageOptions.Builder()
            //.showImageOnLoading(R.drawable.place_holder)
            //.showImageForEmptyUri(R.drawable.question)
            //.showImageOnFail(R.drawable.big_problem)
            .imageScaleType(ImageScaleType.EXACTLY)
            .cacheInMemory(true)
            .cacheOnDisk(true)
            .build();
    imageLoader = ImageLoader.getInstance();
}

@Override
public int getCount() {
    return wallpapersContainer.size();
}

@Override
public Wallpaper getItem(int position) {
    Wallpaper wallpaper = wallpapersContainer.get(position);
    return wallpaper;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View itemView = convertView;
    WallpaperViewHolder currentWallpaperViewHolder;
    //            do we have a view
    if (convertView == null) {
 //                we don't have a view so create one by inflating the layout
        itemView = LayoutInflater.from(getContext()).inflate(R.layout.wallpaper_view, parent, false);
        itemView.getLayoutParams().height = parent.findViewById(R.id.wallpapers_list_view).getMeasuredHeight();
        currentWallpaperViewHolder = getWallpaperViewHolder(itemView);
//                set the tag for this view to the current person view holder
        itemView.setTag(currentWallpaperViewHolder);
        itemView.setTag(R.id.wallpaper_author, currentWallpaperViewHolder.wallpaperAuthor);
        itemView.setTag(R.id.wallpaper_site, currentWallpaperViewHolder.wallpaperSite);
    } else {
//             we have a view so get the tagged view
        currentWallpaperViewHolder = (WallpaperViewHolder) itemView.getTag();
    }
    currentWallpaperViewHolder.wallpaperAuthor.setTag(position);
    currentWallpaperViewHolder.wallpaperSite.setTag(position);
    setWallpaperViewContent(wallpapersContainer.get(position), currentWallpaperViewHolder);
    return itemView;
}

private void setWallpaperViewContent(Wallpaper wallpaper, WallpaperViewHolder wallpaperViewHolder) {
    String authorName = wallpaper.getAuthorName();
    String authorSite = wallpaper.getAuthorSite();
    if (authorName == null) {
        wallpaperViewHolder.wallpaperAuthor.setVisibility(View.GONE);
    } else {
        wallpaperViewHolder.wallpaperAuthor.setText(getContext().getString(R.string.wallpaper_author_name) + " " + authorName);
    }
    if (authorSite == null) {
        wallpaperViewHolder.wallpaperSite.setVisibility(View.GONE);
    } else {
        wallpaperViewHolder.wallpaperSite.setText(getContext().getString(R.string.wallpaper_author_site) + " " + authorSite);
    }
    wallpaperViewHolder.wallpaperDateForUse.setText(wallpaper.getDateForUse());
    imageLoader.displayImage(
            wallpaper.getHDUrl()//the drawable
            , wallpaperViewHolder.imageViewWallpaper//the image view
            , imageLoaderOptions);//the display options
}

private WallpaperViewHolder getWallpaperViewHolder(View itemView) {
    WallpaperViewHolder wallpaperViewHolder = new WallpaperViewHolder();
    wallpaperViewHolder.wallpaperDateForUse
            = (TextView) itemView.findViewById(R.id.wallpaper_date_for_use);
    wallpaperViewHolder.imageViewWallpaper
            = (ImageView) itemView.findViewById(R.id.wallpaper_image);
    wallpaperViewHolder.wallpaperAuthor
            = (TextView) itemView.findViewById(R.id.wallpaper_author);
    wallpaperViewHolder.wallpaperSite
            = (TextView) itemView.findViewById(R.id.wallpaper_site);
    wallpaperViewHolder.setWallpaperBtn
            = (Button) itemView.findViewById(R.id.wallpaper_set);
    return wallpaperViewHolder;
}

private static class WallpaperViewHolder {
    ImageView imageViewWallpaper;
    TextView wallpaperDateForUse;
    TextView wallpaperAuthor;
    TextView wallpaperSite;
    Button setWallpaperBtn;
}
}

在其他情况下,您必须更改文本视图的可见性,否则它们将不可见。

if (authorName == null) {
    wallpaperViewHolder.wallpaperAuthor.setVisibility(View.GONE);
} else {
     wallpaperViewHolder.wallpaperSite.setVisibility(View.VISIBLE);
     wallpaperViewHolder.wallpaperAuthor.setText(getContext().getString(R.string.wa llpaper_author_name) + " " + authorName);
}

希望对您有所帮助。