有效率问题。需要在类之间传递数据

时间:2012-08-08 01:15:01

标签: android gridview android-intent bitmap

所以我有一个Gridview和ImageAdapter类。所有图像都从文件夹中获取,然后填充到网格视图中。然后我有另一个类,在单击时显示完整的图像。然而,每当有人点击图像时,必须再次调用ImageAdapter,并且需要将所有图像重新填充到我的变量中,然后我只选择我需要的图像。这非常低效,但我不知道如何做到这一点。

这是我的代码。

使用网格视图的主类(在本例中为收藏夹)

public class Favorites extends Activity {    

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.favorites);

    GridView gridview = (GridView) findViewById(R.id.favgridview);
    gridview.setAdapter(new ImageAdapter(this));

    gridview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent,View v, int position, long id){
            Intent i = new Intent(getApplicationContext(), FullImageActivity.class);

            i.putExtra("id", position);
            startActivity(i);

        }       
    }); 
}   
}

我的ImageAdapter类,您可以看到我将所有图像作为位图加载到数组中。

 public class ImageAdapter extends BaseAdapter{
private Context mContext;
private Bitmap[]mis_fotos;

public ImageAdapter(Context c){
    mContext = c;
}

public int getCount(){
    get_images();
    return mis_fotos.length;
}

public Bitmap getItem(int position){
    get_images();
    return mis_fotos[position];
}

public long getItemId(int position){
    return 0;
}

public View getView(int position, View convertView, ViewGroup parent){
    ImageView imageView;

    if (convertView == null){
        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;
    }   

    imageView.setImageBitmap(mis_fotos[position]);
    return imageView;
}


private void get_images(){

    String dirPath = mContext.getFilesDir().getAbsolutePath() + File.separator + "favorites";

    File directory = new File(dirPath);

    File[] archivos = directory.listFiles();
    mis_fotos = new Bitmap[archivos.length];

    for (int cont=0; cont<archivos.length;cont++){
        File imgFile = new File(archivos[cont].toString());
        mis_fotos[cont] = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
    }
}

 }

最后我的全图像类

 public class FullImageActivity extends Activity {

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.full_image);

    Intent i = getIntent();

    int position = i.getExtras().getInt("id");
    ImageAdapter imageAdapter = new ImageAdapter(this);


    ImageView imageView = (ImageView) findViewById(R.id.full_image_view);
    imageView.setImageBitmap(imageAdapter.getItem(position));   
}

 }

所以你可以看到,当我使用完整的图像时,我可以传递的是gridview类中的位置整数。然后我必须在ImageAdapter类中再次调用get_images()并重新重新填充数组。

单击图像时,我需要将单个图像从gridview传递到fullimage类。我知道有一种更容易,更有效的方法来做到这一点。我希望这是有道理的。

1 个答案:

答案 0 :(得分:2)

需要解决此问题,您在Adapter类中多次调用get_images()这是一种不好的方法。更好的解决方案是将它从Adapter类中删除并保留在MainActivity中,并在设置适配器之前调用它,

GridView gridview = (GridView) findViewById(R.id.gridView);
get_images();
gridview.setAdapter(new ImageAdapter(this));

然后你的Adapter类的方法应该是,

public int getCount() {
   return mis_fotos.length;
}

public Object getItem(int position) {
    return mis_fotos[position];
}

现在,我想问你想要将图像显示为Next Activity的全屏。那么,为什么不从单击的ListView项中获取Bitmap并将其传递给Next Activity?。那么,你怎么能这样做?在这里,

gridview.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
       Bitmap bitmap = (Bitmap) parent.getAdapter().getItem(position);
       Intent i = new Intent(getApplicationContext(), FullImageActivity.class);
       Bundle bundle = new Bundle();
       bundle.putParcelable("bitmap", bitmap);
      i.putExtras(bundle);
      startActivity(i);
});

所以,没有什么棘手的,只需使用getItem(position);获取位图并使用Bundle将其发送到Next Activity。现在,您可以使用

轻松获取位图
Bundle bundle = getIntent().getExtras();
Bitmap bitmap = bundle.getParcelable("bitmap");
// create new Bitmap with any height, width required by you.
Bitmap newBitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, true);

并显示给ImageView。