2012-08-08 44 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