2017-09-07 6 views
0
package com.example.hussain.assignment4task1; 

import android.os.Parcel; 
import android.os.Parcelable; 

import java.lang.reflect.Array; 
import java.util.ArrayList; 

public class Image implements Parcelable 
{ 
    private String imageName; 
    private String date; 
    public ArrayList<Image> images; 


public Image(String imageName, String date, ArrayList<Image> images) 
{ 
    update(imageName, date, images); 
} 

public void update(String imageName, String date, ArrayList<Image> images) 
{ 
    this.imageName = imageName; 
    this.date = date; 
    this.images = images; 
} 

public String toString() 
{ 
    String str = "Image Name: "+ imageName; 
    str += "\nDate: " + date; 
    return str; 
} 

/** The following block of code parcels/unparcels data for distribution between activities */ 

/** Describe the contents in the parcel -- 
* interface forces implementation */ 
public int describeContents() 
{ 
    return 0; 
} 

public void writeToParcel(Parcel out, int flags) 
{ 
    out.writeString(imageName); 
    out.writeString(date); 
    out.writeList(images); 
} 

public static final Parcelable.Creator<Image> CREATOR = 
     new Parcelable.Creator<Image>() 
     { 
      public Image createFromParcel(Parcel in) 
      { 
       return new Image(in); 
      } 

      public Image[] newArray(int size) 
      { 
       return new Image[size]; 
      } 
     }; 
/** Private constructor called internally only */ 
private Image(Parcel in) 
{ 
    imageName = in.readString(); 
    date = in.readString(); 
} 
} 

これは、私が他のアクティビティの画像に渡す画像の詳細を挿入する私のアクティビティです。Androidスタジオ配列リスト内の特定のオブジェクトにデータを分割する

public void onBackPressed() 
{ 
    Log.i("IMAGE DETAILS", "Back Button Pressed"); 
    storeImageDetails(); // to cover half filled forms 
    Intent resultIntent = new Intent(this, MainActivity.class); 
    // need an array list even if we put a single object only 
    ArrayList<Image> dataList = new ArrayList<Image>(4); 
    dataList.add(image); 
    resultIntent.putParcelableArrayListExtra("IMAGE_DATA", dataList); 
    setResult(RESULT_OK, resultIntent); 
    ImageDetailsActivity.super.onBackPressed(); // do not forget 
} 

/** This method will store all information entered */ 
private void storeImageDetails() 
{ 
    EditText imageNameText = (EditText) findViewById(R.id.imageNameText); 
    EditText dateText = (EditText) findViewById(R.id.dateText); 
    String imageName = imageNameText.getText().toString(); 
    String date = dateText.getText().toString(); 

    ArrayList<Image> dataList = new ArrayList<Image>(); 

    if (image == null) 
     image = new Image(imageName, date, dataList); 
    else 
     image.update(imageName, date, dataList); 

    Log.i("IMAGE DETAILS CHANGED", image.toString()); 
} 

私の主な活動には4つの画像があります。そのうちの1つをクリックすると、詳細を入力できるフォームが開き、戻るボタンを押すと画像名と日付だけが画像の下に表示されます。これはすべての画像で同じように表示されます。私はそれを作る方法を知りたいのですが、クリックした画像だけがそれに渡された詳細を取得し、他の画像は取得しません。個々の画像にデータを渡す分離性は私が把握したいものです。

+0

'Image'オブジェクトは' Image'の子オブジェクトのリストが含まれていますが?それは本当に必要ですか?おそらくそのリストフィールドを静的にすることを意味しましたか? – marmor

+0

また 'writeToParcel'では3つのフィールドを区画に入れていますが、' Image(Parcel in) 'コンストラクタでは2つのフィールドしか読んでいないので、それはバグです – marmor

+0

これを忘れてしまいました。リストソリューションは本当に必要ではなく、その解決策もありませんでした。どのように私は個々にデータを画像に渡すのですか? –

答えて

0

public ArrayList<Image> imagesフィールドはImageクラスの一部ではなく、メインアクティビティのフィールドである必要があります。

はこのような何か試してみてください:

public class MainActivity extends Activity { 
    public ArrayList<Image> images; 

    // show images list via adapter or something, and put an OnClickListener on each 

    private void onImageClicked(int index) { 
     Image image = images.get(index); 
     Intent intent = new Intent(this, ImageDetailsActivity.class); 
     intent.putExtra("IMAGE", image); 
     intent.putExtra("INDEX", index); 
     startActivityForResult(intent, 12345); 
    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == 12345 && resultCode == RESULT_OK) { 
      int index = data.getIntExtra("INDEX", -1); 
      String name = data.getStringExtra("NAME"); 
      String date = data.getStringExtra("DATE"); 

      Image image = images.get(index); 
      image.update(name, date); 
     } 
    } 
} 

public class ImageDetailsActivity extends Activity { 

    public void onBackPressed() { 
     EditText imageNameText = (EditText) findViewById(R.id.imageNameText); 
     EditText dateText = (EditText) findViewById(R.id.dateText); 
     String imageName = imageNameText.getText().toString(); 
     String date = dateText.getText().toString(); 

     Intent resultIntent = new Intent(this, MainActivity.class); 
     resultIntent.putExtra("INDEX", getIntent().getIntExtra("INDEX", -1)); // return the same index we got from Main 
     resultIntent.putExtra("NAME", imageName); 
     resultIntent.putExtra("DATE", date); 
     setResult(RESULT_OK, resultIntent); 

     super.onBackPressed(); 
    } 
} 
+0

ImageDetailsActivityにname + dateを送信するだけで、Imageオブジェクトを送信せずに、Parcelableをすべて実装する必要はありません。 – marmor

+0

resultIntent.putExtra( "INDEX"、getIntent()。getIntExtra( "INDEX") ); //メインの から取得した同じインデックスを返します。これは実際には2番目のパラメータを正しく処理しません。それは整数が必要であると言うエラーを与える –

+0

ええ、私はdefaultValueのparamを追加するのを忘れて、今すぐ試してください – marmor

関連する問題