2016-12-08 7 views
0

Derzeit hat mein Projekt eine GridView, die Bilder und eine Beschreibung unter jedem hat. Wenn Sie auf ein Bild klicken, wird es in einer neuen Aktivität mit dem vollständigen Bild und der Beschreibung darunter geöffnet.GridView - Bild in neuer Aktivität öffnen

Es funktioniert derzeit gut auf Emulator, aber der Onclick tut nichts auf dem realen Gerät.

Wenn ich in MainActivity intent.putExtra("image", item.getImage()) zu intent.putExtra("image", bitmap) ändern, öffnet es die neue, sekundäre DetailsActivity, aber zeigt nur den Text und nicht das Bild. Logcat zeigt keine Fehler für diese Änderung, sagt nur, dass "java.lang.Integer nicht in android.os.Parcelable umgewandelt werden kann".

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 Klasse:

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

Die Bilder (in R.drawable) und Beschreibungen sind in der strings.xml in zwei String-Arrays aufgeführt.

Antwort

0

Manchmal ist die Bitmap möglicherweise zu groß für die Codierung & dekodieren oder übergeben als Byte-Array in der Absicht. Dies kann entweder OOM oder eine schlechte Benutzeroberflächenerfahrung verursachen.

Wie Sie verwenden nur ziehbar Dateien anstelle von Bitmap Sie int-Wert in Ihrer Modellklasse verwenden können:

Sie Ihre ziehbar ID in Ihrer Modellklasse, wie unten kann hinzufügen:

imageItems.add (neues ImageItem (imgs.getResourceId (0, -1), itemsArray [i]));

Während es in Adapter:

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

können Sie diese int Ihrem Detail Aktivität senden und dort können Sie einstellen:..

int imageId = getIntent() getExtras() getInt ("Bild"); imageView.setImageResource (imageId);

aktualisiert Antwort

Ihre Model-Klasse:

public class ImageItem {

// Statt Bitmap Verwendung int public int Bild; öffentlicher String-Titel;

public ImageItem (int image, Zeichenfolge title) {// Hier wird Ihre Ressourcen-ID this.image = image; this.title = Titel; }

public int getImage() {Rückbild; }

öffentliche void setImage (int Bild) {this.Bild = Bild; }

öffentliche Zeichenfolge getTitle() {return title; }

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

}

In Ihrem MainActivity:

gridView.setOnItemClickListener (neu OnItemClickListener() {public void onItemClick (AdapterView Elternteil, Blick 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 getData() {letzte ArrayList imageItems = neue 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++) { 
imageItems.add(new ImageItem(imgs.getResourceId(0, -1), itemsArray[i])); 
} 
return imageItems; 

}

In Ihrem DetailsActivity:

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

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); 

In Ihrem Adater:

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

+0

Ich habe versucht, das Hinzufügen der ersten vorgeschlagenen Codezeile aber es gibt mir Optionen, '1. Parameter der Methode' ImageItem 'von' Bitmap 'in' Int 'zu ändern ODER' Konstruktor erstellen '- Wenn ich einen Konstruktor erstelle, wird er in ImageItem.java (public ImageItem (int resourceId, String-Titel) {}). Muss ich in die resourceId und den String-Titel schreiben? Wenn Sie die zweite Codezeile in GridViewAdapter kopieren, wird imgs rot, Optionen - lokale Variable 'imgs' erstellen, Feld 'imgs' erstellen, Parameter 'Bilder' erstellen oder Verweis umbenennen? – Subject

+0

3. Codezeile, imageView wird rot, Optionen sind lokale Variable erstellen, ImageView-Bildansicht in den Bereich bringen, Feld erstellen, Parameter erstellen, Referenz umbenennen. Ich bin ein Neuling im Programmieren und weiß nicht wirklich, wie ich das richtig anwenden soll. Ich bekomme immer noch einen Code, der nicht funktioniert. Vielen Dank. – Subject

+0

Hallo, ich habe auf den Kommentar geantwortet, indem ich die aktualisierte Antwort nach der vorherigen Antwort gepostet habe. Es ist unter dem Titel "Aktualisierte Antwort" veröffentlicht. Bitte überprüfe die Antwort und lass mich wissen, ob es für dich funktioniert hat. –

0

Um Ihre Implementierung einfacher zu machen, können Sie dieses Image Model Objekt wie folgt über den Konstruktor eine Image Resource ID haben lassen.

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

} 

in Ihrem onClick Methode können Sie tun, so wie unten

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

Ihre DetailsActivity tun das folgende ...

@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); 
Verwandte Themen