Android Gridview - Wie dynamisch eine Bitmap ändern?
-
11-10-2019 - |
Frage
Hallo habe ich eine Gridview, die ich benutze die Bilder auf (kleine Daumen verschiedener Ebenen). Wenn der Benutzer eine Ebene abgeschlossen ist, würde Ich mag die Daumen für diese Ebene ändern. (Irgendwie zeigt, dass es abgeschlossen ist).
habe ich zwei Daumen für jedes Niveau. Eine davon ist die ursprüngliche und eine, die zeigt, dass das Niveau abgeschlossen ist.
Aber wie kann ich die Quelle der Bilder ändern?
Der Code, den ich verwende, um die Bilder wie folgt aussieht zu ziehen.
Die Haupttätigkeit:
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.maps);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
//Open the map which was clicked on, if there is one
if(position+1 > 1){
Toast.makeText(maps.this, "Level " + (position+1) + " is not yet available!", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(maps.this, "Opening Level " + (position+1), Toast.LENGTH_SHORT).show();
Intent myIntent = new Intent(v.getContext(), Tutorial2D.class);
startActivity(myIntent);
}
}
});
}
Die ImageAdapter Klasse:
public class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
//Changing
imageView.setImageResource(mThumbIds[position]);
return imageView;
}
// references to our images
private Integer[] mThumbIds = {
R.drawable.map1, R.drawable.map2, R.drawable.map3,
R.drawable.map4, R.drawable.map5, R.drawable.map6,
R.drawable.map7, R.drawable.map8, R.drawable.map9,
R.drawable.map10, R.drawable.map11, R.drawable.map12,
R.drawable.map13, R.drawable.map14, R.drawable.map15,
R.drawable.map16, R.drawable.map17, R.drawable.map18,
R.drawable.map19
};
}
Lösung
Sie könnten eine neue Bitmap erstellen aus einem Daumen basiert und ziehen Ihre persönlichen Grafiken über eine Leinwand verwenden. Dann könnten Sie diese Bitmap in die Imageview mit imageView.setImageBitmap geben
[Bearbeiten]
so etwas wie
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
if (mLevelfinished) {
//create thumbnail bitmap
mThumbBmp = BitmapFactory.decodeResource(mResources, mThumbIds[position]);
//draw a check over the bitmap
Canvas c = new Canvas(mThumbBmp);
c.drawBitmap(mCheckBitmap, destX, destY, null);
imageView.setImageBitmap(mThumbBmp);
} else {
imageView.setImageResource(mThumbIds[position]);
}
return imageView;
}
[edit2]
Ich sehe jetzt irgendwie ich Ihre Frage falsch verstanden .. doh. Anstatt die Ebene komplett Daumen dynamisch erstellen, haben Sie bereits den Daumen für diejenigen. In diesem Fall würde ich ein anderes Array erstellen, das diese abgeschlossene Daumen und hole die Ressource von der korrekten Array hat. Und mit Arrays zu halten, speichern vielleicht das Niveau Abschluss in einer auch:
imageView.setImageResource((mLevelCompleted[position]) ? mThumbCompleteIds[position] : mThumbIds[position]);
Andere Tipps
Ich habe das gleiche Problem. Hier ist, was ich tun:
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Toast.makeText(Punch.this, "" + mThumbIds[position], Toast.LENGTH_SHORT).show();
mThumbIds[position]=R.drawable.crabx;//crabxImg;
//here is where I would like to redraw the whole grid but it will not let me.
//Because ImageAdapter is not defined within this callback.
}
})
Ich bin mit einem schmutzigen Trick, die nützlich sein können, wenn Sie vorher wissen, welche Bitmaps werden angezeigt.
ich eine andere unsichtbare ImageView
nur beiseite die sichtbaren einrichten und bearbeiten
myImageView.setVisibility(n); // (n = 0 = View.VISIBLE) or (n = 8 = View.GONE)
Verwenden Sie die Konstante View.INVISIBLE
nicht die 4
Werte, weil View.GONE
die richtige Wirkung. Wenn die Sichtbarkeit auf View.GONE
gesetzt ist, nehmen Sie das Objekt nicht Platz im Layout. Dies ist vergleichbar mit display: none;
von CSS.