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()を再度呼び出して、配列をもう一度再入力する必要があります。

画像がクリックされたときに、グリッドビューからフルイメージクラスに単一の画像を渡す必要があるすべてです。これを行うには、もっと簡単ではるかに効率的な方法があることを私は知っています。これが理にかなっていることを願っています。

4

1 に答える 1

2

回避策が必要ですget_images()。Adapterクラス内で複数回呼び出していますが、これは悪い方法です。より良い解決策は、Adapterクラスからそれを削除し、MainActivity内に保持し、Adapterを次のように設定する前に呼び出すことです。

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];
}

さて、次のアクティビティに画像をフルスクリーンで表示したいというあなたの問題に行き着きました。では、クリックした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に表示します。

于 2012-08-08T05:26:37.650 に答える