【问题标题】:Android Cardslib same thumbnail appears for all itemsAndroid Cardslib 为所有项目显示相同的缩略图
【发布时间】:2016-06-04 10:41:59
【问题描述】:

我正在使用 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" />

【问题讨论】:

  • getTag() 是否也为所有项目返回相同的结果?
  • 当在“tagname = packageInfo.packageName;”行之后打印“tagname”时,我想我有 50 个左右的应用程序他们是不同的名字。但奇怪的是,with-in getTag() : print 只出现了两次同名(google-contacts 应用程序名称)。是否由于 setCustomSource() 作为 Asynctask 运行?并且标记名是全局变量?
  • 检查答案。每次迭代都会覆盖标记名。

标签: android cardslib


【解决方案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));

【讨论】:

  • 感谢您的回答,让我检查解决方案并在几分钟内更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多