2016-06-04 2 views
0

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" /> 
+0

ist getTag() zurückkehrt auch für alle Artikel gleich? –

+0

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? –

+1

überprüfen Sie die Antwort. Sie überschreiben mit jeder Iteration den Tagnamen. –

Antwort

1

Ok statt tagname zu einer Variablen zu halten und es zu einer inneren Durchführung von Custom vorbei, können Sie die Custom in einer anderen Klasse implementieren und eine Feldvariable halten den Tag-Namen zu halten. Wie in der aktuellen Implementierung wird der globale (in diesem Kontext) Tagname durch jede Iteration ersetzt.

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; 
    } 
} 

und nennen es mag: thumb.setCustomSource(new MyThumbnailSource(tagname));

+0

Danke für die Antwort, Lassen Sie mich die Lösung überprüfen und in wenigen Minuten aktualisieren. –

+1

Großartig! Danke, es hat einwandfrei funktioniert –

Verwandte Themen