Listview项目在点击通知时重复

时间:2014-05-22 17:00:15

标签: android listview

如果我在后台播放歌曲并在点击通知图标后返回应用程序,我将获得listView项目重复。在第一次打开应用程序时,项目不会重复。可能有什么不对?在我的适配器类下面发布。

适配器:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View view = convertView;
    ViewHolder holder = null;
    final int pos = position;

    if (view == null) {
        LayoutInflater inflater = (LayoutInflater) parent.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = (RelativeLayout) inflater.inflate(R.layout.song, parent,
                false);
        holder = new ViewHolder();
        holder.tvTitle = (TextView) view.findViewById(R.id.tv_song_title);
        holder.tvArtist = (TextView) view.findViewById(R.id.tv_song_artist);
        holder.imgAlbumArt = (ImageView) view
                .findViewById(R.id.img_lv_album_art);

        holder.tvArtist.setText(songs.get(position).getArtist());
        holder.tvTitle.setText(songs.get(position).getTitle());

        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }

    int id = (int) songs.get(position).getId();

    if (bitmaps == null) {
        Bitmap bm = MainActivity.getCachedArtwork(mContext,
                id, MainActivity.getDefaultArtwork(mContext));
        holder.imgAlbumArt.setImageBitmap(bm);
        bitmaps.put(id, bm);
        Log.d("inside null", "key=" + id + "bm=" + bm + "pos" + position);
    } else if (bitmaps.containsKey(id)) {
        Bitmap bm = bitmaps.get(id);
        holder.imgAlbumArt.setImageBitmap(bm);
        bitmaps.put(id, bm);
        Log.d("inside contains key", "key=" + id + "bm=" + bm + "pos"
                + position);
    } else {
        Bitmap bm = MainActivity.getCachedArtwork(mContext,
                id, MainActivity.getDefaultArtwork(mContext));

        holder.imgAlbumArt.setImageBitmap(bm);
        bitmaps.put(id, bm);
        Log.d("inside else", "key=" + id + "bm=" + bm + "pos" + position);
    }
  return view;
}

MainActivity:

public static Bitmap getCachedArtwork(Context context, int artIndex,
        Bitmap defaultArtwork) {
    Bitmap d = null;
    synchronized (sArtCache) {
        d = sArtCache.get(artIndex);
    }
    if (d == null) {
        d = defaultArtwork;
        final Bitmap icon = defaultArtwork;
        int w = icon.getWidth();
        int h = icon.getHeight();
        Bitmap b = getArtworkQuick(context, artIndex, w, h);
        if (b != null) {
            d = b;// new FastBitmapDrawable(b);
            synchronized (sArtCache) {
                // the cache may have changed since we checked
                Bitmap value = sArtCache.get(artIndex);
                if (value == null) {
                    sArtCache.put(artIndex, d);
                } else {
                    d = value;
                }
            }
        }
    }
    return d;
}

// Get album art for specified album. This method will not try to
// fall back to getting artwork directly from the file, nor will
// it attempt to repair the database.
private static Bitmap getArtworkQuick(Context context, int album_id, int w, int h) {
    // NOTE: There is in fact a 1 pixel frame in the ImageView used to
    // display this drawable. Take it into account now, so we don't have to
    // scale later.
    w -= 2;
    h -= 2;
    ContentResolver res = context.getContentResolver();
    Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id);
    if (uri != null) {
        ParcelFileDescriptor fd = null;
        try {
            fd = res.openFileDescriptor(uri, "r");
            int sampleSize = 1;

            // Compute the closest power-of-two scale factor 
            // and pass that to sBitmapOptionsCache.inSampleSize, which will
            // result in faster decoding and better quality
            sBitmapOptionsCache.inJustDecodeBounds = true;
            BitmapFactory.decodeFileDescriptor(
                    fd.getFileDescriptor(), null, sBitmapOptionsCache);
            int nextWidth = sBitmapOptionsCache.outWidth >> 1;
            int nextHeight = sBitmapOptionsCache.outHeight >> 1;
            while (nextWidth>w && nextHeight>h) {
                sampleSize <<= 1;
                nextWidth >>= 1;
                nextHeight >>= 1;
            }

            sBitmapOptionsCache.inSampleSize = sampleSize;
            sBitmapOptionsCache.inJustDecodeBounds = false;
            Bitmap b = BitmapFactory.decodeFileDescriptor(
                    fd.getFileDescriptor(), null, sBitmapOptionsCache);

            if (b != null) {
                // finally rescale to exactly the size we need
                if (sBitmapOptionsCache.outWidth != w || sBitmapOptionsCache.outHeight != h) {
                    Bitmap tmp = Bitmap.createScaledBitmap(b, w, h, true);
                    b.recycle();
                    b = tmp;
                }
            }


            return b;
        } catch (FileNotFoundException e) {
        } finally {
            try {
                if (fd != null)

                    fd.close();
            } catch (IOException e) {
            }
        }
    }
    return null;
}

0 个答案:

没有答案