2016-12-08 4 views
0

現在、私のプロジェクトには、それぞれの下に画像と説明があるGridViewがあります。画像をクリックすると、その画像の下に完全な画像と説明が表示された新しいアクティビティで開きます。GridView - 新しいアクティビティの画像を開く

現在、エミュレータで正常に動作していますが、実際のデバイスではonclickは何もしません。

MainActivityでintent.putExtra("image", item.getImage())intent.putExtra("image", bitmap)に変更すると、新しい2次DetailsActivityが開きますが、画像ではなくテキストのみが表示されます。 Logcatはこの変更のエラーを表示せず、 "java.lang.Integerをandroid.os.Parcelableにキャストできません"ということだけを示します。

MainActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    gridView = (GridView) findViewById(R.id.gridView); 
    gridAdapter = new GridViewAdapter(this, R.layout.grid_item_layout, getData()); 
    gridView.setAdapter(gridAdapter); 

    gridView.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 

      ImageItem item = (ImageItem) parent.getItemAtPosition(position); 

       Intent intent = new Intent(MainActivity.this, DetailsActivity.class); 
       intent.putExtra("title", item.getTitle()); 
       intent.putExtra("image", item.getImage()); 

      startActivity(intent); 
     } 
    }); 

} 


private ArrayList<ImageItem> getData() { 
    final ArrayList imageItems = new ArrayList(); 
    String[] itemsArray = getResources().getStringArray(R.array.grid_ids); 

    TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids); 
    for (int i = 0; i < imgs.length(); i++) { 
     Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), imgs.getResourceId(i, -1)); 
     imageItems.add(new ImageItem(bitmap, itemsArray[i])); 
    } 
    return imageItems; 
} 

DetailsActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_details); 

    Intent intent = getIntent(); 

    String title = getIntent().getStringExtra("title"); 
    Bitmap image = getIntent().getParcelableExtra("image"); 

    TextView titleTextView = (TextView) findViewById(R.id.title); 
    titleTextView.setText(title); 

    ImageView imageView = (ImageView) findViewById(R.id.image); 
    imageView.setImageBitmap(image); 

にImageItemクラス:

public class ImageItem { 

public Bitmap image; 
public String title; 

public ImageItem(Bitmap image, String title) { 
    super(); 
    this.image = image; 
    this.title = title; 
} 

public Bitmap getImage() { 
    return image; 
} 

public void setImage(Bitmap image) { 
    this.image = image; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

GridViewAdapter:

public class GridViewAdapter extends ArrayAdapter<ImageItem> { 

private Context context; 
private int layoutResourceId; 
private ImageView imageView; 
private ArrayList<ImageItem> data = new ArrayList<ImageItem>(); 

public GridViewAdapter(Context context, int layoutResourceId, ArrayList<ImageItem> data) { 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    ViewHolder holder; 

    if (row == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 
     holder = new ViewHolder(); 
     holder.imageTitle = (TextView) row.findViewById(R.id.text); 
     holder.image = (ImageView) row.findViewById(R.id.image); 

     row.setTag(holder); 
    } else { 
     holder = (ViewHolder) row.getTag(); 
    } 

    ImageItem item = data.get(position); 
    holder.imageTitle.setText(item.getTitle()); 
    holder.image.setImageBitmap(item.getImage()); 
    return row; 
} 

static class ViewHolder { 
    TextView imageTitle; 
    ImageView image; 
} 

イメージ(R.drawable内)と説明は、strings.xmlの2つの文字列配列でリストされています。

答えて

0

時には、ビットマップがエンコードのために大きすぎる場合があります。&デコードまたはインテントのバイト配列として渡します。これは、OOMまたは悪いUIエクスペリエンスを引き起こす可能性があります。 (

imageItems.add:あなたが以下のようにモデルクラスであなたの描画可能なIDを追加することができます

してあなただけの代わりに、ビットマップのあなたのモデルクラスにint型の値を使用することができ、描画可能ファイルを使用していると新しいImageItem(imgs.getResourceId(0、-1)、itemsArray [i]));

アダプタでの使用中:

holder.image.setImageResource(imgs.getResourceId(0、-1))。

あなたはあなたの細部の活動にこのint型を送信することができますし、あそこにあなたが設定できます。

int型IMAGEID = getIntent()getExtras()のgetInt( "画像"); imageView.setImageResource(imageId);

更新回答

モデルクラス:

パブリッククラスにImageItem {//代わりにビットマップを使用int型公共int型の画像の

。 public String title;

public ImageItem(int image、String title){//ここであなたのリソースID this.image = image; this.title = title; }

public int getImage(){return image; }

public void setImage(int image){this。イメージ=イメージ; }

public String getTitle(){return title; }

public void setTitle(String title){this.title = title; (新しいOnItemClickListener(){公共空onItemClick(AdapterView親、ビューV、int型の位置、長いID){

ImageItem item = (ImageItem) parent.getItemAtPosition(position); 

     Intent intent = new Intent(MainActivity.this, DetailsActivity.class); 
     intent.putExtra("title", item.getTitle()); 
     intent.putExtra("image", item.getImage()); 

    startActivity(intent); 
} 
}); 

gridView.setOnItemClickListener:あなたのMainActivityで}

}

プライベートArrayList getData(){最終ArrayList imageItems =新しいArrayList(); String [] itemsArray = getResources()。getStringArray(R.array.grid_ids);

あなたDetailsActivityで
TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids); 
for (int i = 0; i < imgs.length(); i++) { 
imageItems.add(new ImageItem(imgs.getResourceId(0, -1), itemsArray[i])); 
} 
return imageItems; 

}

@Overrideは、ボイドのonCreate(バンドルsavedInstanceState){super.onCreate(savedInstanceState)を保護しました。 setContentView(R.layout.activity_details);あなたのadaterで

Intent intent = getIntent(); 

String title = getIntent().getStringExtra("title"); 
int image = getIntent().getExtras().getInt("image"); 

TextView titleTextView = (TextView) findViewById(R.id.title); 
titleTextView.setText(title); 

ImageView imageView = (ImageView) findViewById(R.id.image); 
imageView.setImageResource(image); 

holder.image.setImageResource(imgs.getResourceId(0、-1));

+0

私は、コードの最初の提案行を追加しようとしましたしかし、それは私に 'ImageItem'メソッドの最初のパラメータを 'Bitmap'から 'Int'に変更するか、 'Constructorを作成する'にオプションを与えます - コンストラクタを作成すると、ImageItem.java(public ImageItem(int resourceId、文字列タイトル){})。私はresourceIdとStringのタイトルを記述する必要がありますか? 2行目のコードをGridViewAdapterにコピーすると、imgsは赤色になり、オプション - ローカル変数 'imgs'を作成し、フィールド 'imgs'を作成し、パラメータ 'images'を作成するか、リファレンスの名前を変更しますか? – Subject

+0

3行目のコードでは、imageViewが赤色になり、オプションがローカル変数を作成し、ImageViewイメージビューをスコープに持ち込み、フィールドを作成し、パラメータを作成し、参照名を変更します。私はプログラミングの初心者で、これを正しく正しく適用する方法はまだ分かりません。私はまだ動作しないコードを取得しています。ありがとう。 – Subject

+0

こんにちは、前回の回答の後に更新された回答を投稿してコメントに返信しました。それはタイトル「更新された回答」の下に掲載されます。答えを確認し、それがあなたのために働いたことを教えてください。 –

0

あなたの実装をより簡単にするために、次のようにコンストラクタを介してそのイメージモデルオブジェクトにイメージリソースIDを持たせることができます。あなたのDetailsActivityは、次の操作を行います

public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 

    ImageItem item = (ImageItem) parent.getItemAtPosition(position); 

     Intent intent = new Intent(MainActivity.this, DetailsActivity.class); 
     intent.putExtra("title", item.getTitle()); 
     // your image resource should be int 
     intent.putExtra("imageId", item.getImage()); 

    startActivity(intent); 
} 

以下のようにあなたがそうすることができ、あなたのonClick方法で

public class ImageItem { 

public int image; 
public String title; 

public ImageItem(int image, String title) { 
    // image means your image resource id 
    this.image = image; 
    this.title = title; 
} 

public int getImage() { 
    return image; 
} 

public void setImage(int image) { 
    this.image = image; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

} 

...

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_details); 

    Intent intent = getIntent(); 

    String title = getIntent().getStringExtra("title"); 

    // here -1 is the default value for, if that extra isn't found 
    int image = getIntent().getIntExtra("imageId", -1); 

    TextView titleTextView = (TextView) findViewById(R.id.title); 
    titleTextView.setText(title); 

    ImageView imageView = (ImageView) findViewById(R.id.image); 
    imageView.setImageResource(image); 
関連する問題