Ich verwende Cardslib-Bibliothek. Ich habe versucht, Miniaturansicht für jedes Pacakge von seinem Symbol hinzuzufügen. Das Symbol ist Zeichnungsart. Ich nehme an, wir müssen CustomSource verwenden, um ein Bitmap daraus zu erstellen. Dann füge es der Karte hinzu.Android Cardslib dieselbe Miniatur erscheint für alle Objekte
Das Problem mit dem folgenden Code ist, alle Pakete erhalten die gleiche Vorschaubild. (Das Bild vom letzten Paket, das auf der Liste erscheint). Liegt das daran, dass cardslib sie mit den eingebauten AsyncTask
und LRUCache
lädt? Wie behebe ich dieses Problem?
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" />
ist getTag() zurückkehrt auch für alle Artikel gleich? –
Ich denke, ich habe 50 Apps oder so, wenn 'tagname' nach der Zeile "tagname = packageInfo.packageName;" Sie sind verschiedene Namen. Aber Seltsam, mit-in getTag(): Druck erschien nur zweimal mit dem gleichen Namen (Google-Kontakte App-Name). Liegt es daran, dass setCustomSource() als Asynctask ausgeführt wird? und Tagname ist globale Variable? –
überprüfen Sie die Antwort. Sie überschreiben mit jeder Iteration den Tagnamen. –