Android GridView-如何动态更改位图?

Android GridView-如何动态更改位图?,android,gridview,bitmap,bitmapsource,Android,Gridview,Bitmap,Bitmapsource,你好,我有一个gridView,我用它来显示一些图片(不同级别的小拇指)。 当用户完成一个级别时,我想更改该级别的拇指。(以某种方式表明它已经完成) 我为每个级别创建了两个拇指。一个是原始的,另一个显示级别已完成 但是我怎样才能改变图像的来源呢 我用来绘制图像的代码如下所示 主要活动: /** Called when the activity is first created. */ public void onCreate(Bundle savedInstanceState) { su

你好,我有一个gridView,我用它来显示一些图片(不同级别的小拇指)。 当用户完成一个级别时,我想更改该级别的拇指。(以某种方式表明它已经完成)

我为每个级别创建了两个拇指。一个是原始的,另一个显示级别已完成

但是我怎样才能改变图像的来源呢

我用来绘制图像的代码如下所示

主要活动:

/** 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);
        }
      }
  });
}

}

您可以基于拇指创建一个新位图,并使用画布在其上绘制额外的图形。然后可以使用imageview.setImageBitmap将该位图传递给imageview

[编辑]

差不多

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;
}
[编辑二]

我现在明白了我有点误解了你的问题。。doh。您已经拥有了这些功能的拇指,而不是动态创建完整的拇指级别。在这种情况下,我将创建另一个具有完整拇指的数组,并从正确的数组中选择资源。为了坚持使用阵列,还可以将级别完成存储在一个阵列中:

imageView.setImageResource((mLevelCompleted[position]) ? mThumbCompleteIds[position] : mThumbIds[position]);

我也有同样的问题。 以下是我的工作:

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.

  }


})
gridview.setAdapter(新的ImageAdapter(this));
setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父视图、视图v、整型位置、长id){
Toast.makeText(Punch.this,“+mThumbIds[position],Toast.LENGTH_SHORT).show();
mThumbIds[position]=R.drawable.crabx;//crabxImg;
//在这里,我想重新绘制整个网格,但它不会让我。
//因为此回调中未定义ImageAdapter。
}
})

我使用了一个肮脏的技巧,当您之前知道将显示哪些位图时,它可能会很有用

我在可见视图旁边设置了另一个不可见的
ImageView
,然后

myImageView.setVisibility(n); // (n = 0 = View.VISIBLE) or (n = 8 = View.GONE)

不要使用常量
视图.INVISIBLE
4
,因为
View.GONE
是正确的效果。当可见性设置为
View.GONE
时,对象将不会占用布局中的空间。这类似于
显示:无来自CSS。

您能再精确一点吗?你有我可以看的示例代码吗?我不明白为什么我应该创建一个画布来进行图像处理?我用一些代码更新了我的答案。要操作位图,你需要一个画布对象。我在SharedReference中保存了一些missionCompletedVariables,并从右边的数组中创建了所需的图片。谢谢
myImageView.setVisibility(n); // (n = 0 = View.VISIBLE) or (n = 8 = View.GONE)