2012-08-08 32 views
0

所以我有一个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类。我知道有一个更简单,更有效的方法来做到这一点。我希望这是有道理的。

回答

2

变通方法要求您在Adapter类中调用get_images()多次,这是一种糟糕的方式。更好的办法是从适配器类中删除,并保持在MainActivity内并设置适配器像以前那样只是把它,

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

然后你的适配器类方法应该是这样的,

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

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

现在,我来你的问题是,你想显示一个图像全屏显示到下一个活动。那么,为什么不从点击的ListView项目中获取位图并将其传递给下一个活动?那么,你怎么能这样做呢?这是,

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 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。

+1

+1好答案。 – 2012-08-08 05:27:34

+0

谢谢!位图位图=(位图)parent.getAdapter()。getItem(position);'一段代码对我来说是神奇的。是我需要的。现在我可以访问该课程,它开启了各种可能性。我得到它的工作,但我改变了我的代码了一下。我没有加载和位图数组,而是一组文件名,然后我只是根据文件名设置图像并在活动之间传递文件名。我认为现在工作得很好。谢谢您的帮助! – Dan 2012-08-08 13:53:48