2016-09-03 4 views
0

Я постараюсь как можно более подробно объяснить, я разрабатываю приложение для Android, в классе Java у меня есть список с некоторыми данными (объектами), я хочу передать этот список другому классу Java (Activity), чтобы используйте данные этого списка в этом классе.Как передать список объектов из одного действия в другое?

вот мой код:

public class DocumentariesCategoriesActivity extends Activity implements AdapterView.OnItemClickListener{ 

    private List<VideoEntity> videoSearchResult; 

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

     Log.d(TAG, "onItemClick(AdapterView<?> , View, int, long) - Ini"); 


     new Thread(new Runnable() { 
      @Override 
      public void run(){ 
       YouTubeConnector youtube = new YouTubeConnector(DocumentariesCategoriesActivity.this); 
       videoSearchResult = youtube.search(); 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 
         Intent intent = new Intent(DocumentariesCategoriesActivity.this, DocumentariesCatalogActivity.class).putExtra("videos", (Parcelable) videoSearchResult); 
         startActivity(intent); 
        } 
       }); 

      } 
     }).start(); 
    } 

Как вы можете видеть в коде активности я хочу передать список является DocumentariesCatalogActivity. Я не знаю, правильно ли это передать его, если это будет тогда мой вопрос, как я могу захватить список VideoEntity в классе DocumentariesCatalogActivity?

Я видел несколько похожих вопросов, но только со строковым типом.

+2

дубликат этого вопроса: http://stackoverflow.com/questions/12092612/pass-list-of-objects-from- one-activity-to-other-activity-in-android –

+0

@AhmedAshrafG это не решило мою проблему, наконец-то я ее разрешил, я поставил ответ – rainman

+0

@rainman, как это не решило проблему? Разве вы не используете одно и то же решение в своем ответе? – Sufian

ответ

2

Я мог бы решить его реализации Parcelable интерфейс в моем классе объекта VideoEntity:

public class VideoEntity implements Parcelable{ 

private String title; 
private String description; 
private String thumbnailURL; 
private String id; 


public VideoEntity() { 

} 

public VideoEntity(Parcel in) { 
    title = in.readString(); 
    description = in.readString(); 
    thumbnailURL = in.readString(); 
    id = in.readString(); 
} 



public String getId() { 
    return id; 
} 

public void setId(String id) { 
    this.id = id; 
} 

public String getThumbnailURL() { 
    return thumbnailURL; 
} 

public void setThumbnailURL(String thumbnail) { 
    this.thumbnailURL = thumbnail; 
} 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

public String getTitle() { 
    return title; 
} 

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

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 

    dest.writeString(id); 
    dest.writeString(title); 
    dest.writeString(description); 
    dest.writeString(thumbnailURL); 
} 

public static final Creator<VideoEntity> CREATOR = new Creator<VideoEntity>() { 
    @Override 
    public VideoEntity createFromParcel(Parcel in) { 
     return new VideoEntity(in); 
    } 

    @Override 
    public VideoEntity[] newArray(int size) { 
     return new VideoEntity[size]; 
    } 
}; 

}

и в деятельности, с которого я хочу передать список я изменил это:

Intent intent = new Intent(DocumentariesCategoriesActivity.this, DocumentariesCatalogActivity.class).putExtra("videos", (Parcelable) videoSearchResult); 
startActivity(intent); 

к настоящему времени:

Intent intent = new Intent(getApplicationContext(), VideosCatalogActivity.class); 
        intent.putExtra("com.myapp.entities.VideoEntity" , videoSearchResult); 
        startActivity(intent); 

наконец для получения списка в другой деятельности я использовал это:

Bundle bundle = getIntent().getExtras(); 
    videosList = bundle.getParcelableArrayList("com.myapp.entities.VideoEntity"); 
-1

Попробуйте это, преобразуйте объект в байт [], пропустите его через намерение, как обычно. Затем преобразуйте его обратно в объект.

Преобразование из объекта в массив байтов

// toByteArray and toObject are taken from: http://scr4tchp4d.blogspot.co.uk/2008/07/object-to-byte-array-and-byte-array-to.html 
public static byte[] toByteArray(Object obj) throws IOException { 
    byte[] bytes = null; 
    ByteArrayOutputStream bos = null; 
    ObjectOutputStream oos = null; 
    try { 
     bos = new ByteArrayOutputStream(); 
     oos = new ObjectOutputStream(bos); 
     oos.writeObject(obj); 
     oos.flush(); 
     bytes = bos.toByteArray(); 
    } finally { 
     if (oos != null) { 
      oos.close(); 
     } 
     if (bos != null) { 
      bos.close(); 
     } 
    } 
    return bytes; 
} 

Используйте это, чтобы создать массив, чтобы положить в умыслом.

Intent intent = new Intent(DocumentariesCategoriesActivity.this, DocumentariesCatalogActivity.class) 
intent.putExtra("videos", toByteArray(videoSearchResult)); 
startActivity(intent); 

Затем в следующем упражнении используйте этот метод.

public static Object toObject(byte[] bytes) throws IOException, ClassNotFoundException { 
    Object obj = null; 
    ByteArrayInputStream bis = null; 
    ObjectInputStream ois = null; 
    try { 
     bis = new ByteArrayInputStream(bytes); 
     ois = new ObjectInputStream(bis); 
     obj = ois.readObject(); 
    } finally { 
     if (bis != null) { 
      bis.close(); 
     } 
     if (ois != null) { 
      ois.close(); 
     } 
    } 
    return obj; 
} 

Чтобы преобразовать массив байтов в ваш объект путем литья.

Intent intent = getIntent(); 
List<VideoEntity> videoSearchResult = (List<VideoEntity>) intent.getByteArrayExtra("videos"); 

Вы можете привести его в порядок, поставив обе функции преобразования в свой класс. Но убедитесь, что он работает первым.

+2

Почему это плохой ответ? Если вы проголосуете за него, оставьте комментарий, объясняющий почему. Это никому не помогает. – SamC

+0

Не мой нисходящий канал, но ваше решение не лучшее (не уверен, что он работает, не пробовал).Было бы лучше (с точки зрения ООП), чтобы объект «VideoEntity» реализовал «Parcelable» или «Serializable», и так оно и делается в Android. – Sufian

Смежные вопросы