0

我正在使用 Cardslib 库。我试图从其图标中为每个 pacakge 添加缩略图视图。图标是可绘制类型。所以我假设,我们需要使用 CustomSource 来创建它的位图。然后将其添加到卡片中。

以下代码的问题是,所有包都获得相同的缩略图。(列表中出现的最后一个包的图像)。这是因为 cardlib 使用内置AsyncTaskLRUCache. 如何解决这个问题?

public void listpkg(Context c) {
    ArrayList<Card> cards = new ArrayList<Card>();
    Card card = new Card(this);
    mContext = c;
    CardHeader header = new CardHeader(c);
    PackageManager pm = getPackageManager();
    List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

    for (ApplicationInfo packageInfo : packages) {
        header = new CardHeader(this);
        header.setTitle(pm.getApplicationLabel(packageInfo).toString());
        card = new Card(this);
        card.addCardHeader(header);
        card.setTitle("Package: " + packageInfo.packageName);
        icon =getPackageManager().getApplicationIcon(packageInfo); //TODO use this icon
        tagname = packageInfo.packageName;
    // CustomSource --
             thumb = new CardThumbnail(c);
             thumb.setCustomSource(new CardThumbnail.CustomSource() {
                                          @Override
                                          public String getTag() {
                                              return tagname;
                                          }
                 @Override
                 public Bitmap getBitmap() {
                     PackageManager pm = mContext.getPackageManager();
                     Bitmap bitmap = null;
                     try {
                         bitmap = drawableToBitmap(pm.getApplicationIcon(getTag()));
                     } catch (PackageManager.NameNotFoundException e) {
                     }
                     return bitmap;
                 }

                 private Bitmap drawableToBitmap(Drawable drawable) {
                     if (drawable instanceof BitmapDrawable) {
                         return ((BitmapDrawable) drawable).getBitmap();
                     }

                     Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
                     Canvas canvas = new Canvas(bitmap);
                     drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
                     drawable.draw(canvas);

                     return bitmap;
                 }
            });

            card.addCardThumbnail(thumb);
    // CustomSource --
            cards.add(card);
        }


    CardArrayRecyclerViewAdapter mCardArrayAdapter;

    mCardArrayAdapter = new CardArrayRecyclerViewAdapter(this, cards);

    //Staggered grid view
    CardRecyclerView mRecyclerView = (CardRecyclerView) this.findViewById(R.id.mainListView);
    mRecyclerView.setHasFixedSize(false);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    //Set the empty view
    if (mRecyclerView != null) {
        mRecyclerView.setAdapter(mCardArrayAdapter);
    }

}

xml

<it.gmariotti.cardslib.library.recyclerview.view.CardRecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:list_card_layout_resourceID="@layout/list_card_thumbnail_layout"
    android:layout_marginLeft="12dp"
    android:layout_marginRight="12dp"
    android:layout_marginTop="12dp"
    android:id="@+id/mainListView" />
4

1 回答 1

1

好的,不是将标记名保留给一个变量并将其传递给 CustomSource 的内部实现,而是在另一个类中实现 CustomSource 并保留一个字段变量来保存标记名。在当前实现中,全局(在此上下文中)标记名将被每次迭代替换。

class MyThumbnailSource implements CardThumbnail.CustomSource {
    private String tagname;

    public MyThumbnailSource(String tagname){
        this.tagname = tagname;
    }

    @Override
    public String getTag() {
        return tagname;
    }

    @Override
    public Bitmap getBitmap() {
        PackageManager pm = mContext.getPackageManager();
        Bitmap bitmap = null;
        try {
            bitmap = drawableToBitmap(pm.getApplicationIcon(getTag()));
        } catch (PackageManager.NameNotFoundException e) {
        }
        return bitmap;
    }

    private Bitmap drawableToBitmap(Drawable drawable) {
        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable) drawable).getBitmap();
        }

        Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        drawable.draw(canvas);

        return bitmap;
    }
}

并称之为:thumb.setCustomSource(new MyThumbnailSource(tagname));

于 2016-06-05T08:05:15.373 回答