我有两个活动,MainActivity
和MovieDetail
以及一个java类MovieInfo
。
MovieInfo
使用static ArrayList< MovieInfo >
个实例正确初始化MovieInfo
。
MainActivity
从static ArrayList
中存储的MovieInfo
中选择一个实例化对象,然后通过MovieDetail
方法将其传递给putExtra
个活动。
当我尝试使用contains
static ArrayList
中的MainActivity
方法与之前选择的实例化对象时,它正在运行。
为什么当我从MovieDetail
使用MainActivity
通过putExtra
方法收到的对象尝试相同时,它不再识别它?
MainActivity
public class MainActivity extends AppCompatActivity {
SQLiteDatabase db;
static MovieInfo movie = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MovieInfo.setPtr(ptr);
db = ptr.getReadableDatabase();
ptr.onCreate(db);
if (this.movie == null) this.movie = new MovieInfo(db);
listView = (ListView) findViewById(R.id.movieList);
adapter = new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, MovieInfo.getArrayMovieInfo());
. . .
/* When the user clicks on an item via the adapater */
MovieInfo movieSelected = (MovieInfo) listView.getItemAtPosition(position);
/* Test 1 */
boolean test = MovieInfo.getArrayMovieInfo().contains(movieSelected);
Log.d("1. Object recognise -> ", test ? "True" : "False");
Log.d("1. Object Content", movieSelected.toString());
Intent movieDetail = new Intent();
movieDetail.setClass(getBaseContext(), MovieDetail.class);
movieDetail.putExtra("Movie", movieSelected);
startActivity(movieDetail);
}
MovieDetail
public class MovieDetail extends AppCompatActivity {
MovieInfo movie = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.movie_detail);
movie = (MovieInfo) getIntent().getSerializableExtra("Movie");
boolean test = MovieInfo.getArrayMovieInfo().contains(movie);
/* Test 2 */
Log.d("2. Object recognise -> ", test ? "True" : "False");
Log.d("2. Object Content", movie.toString());
/* The array is populated */
for (MovieInfo curr_movie : MovieInfo.getArrayMovieInfo()) {
Log.d("ARRAY MOVIE CONTENT : ", curr_movie.getTitle()+"\n");
}
. . .
}
MovieInfo
public class MovieInfo implements Serializable {
private static SQLiteDatabase db = null;
private static SQLiteOpenHelper ptr = null;
private static ArrayList<MovieInfo> arrayMovieInfo = new ArrayList<>();
/* Movie */
private int id;
private String title;
private String director;
private float rate;
private int c_id;
/* Cinema */
private String c_wording;
private String c_address;
private String c_city;
private String c_date;
/* Genre */
private String g_wording;
/* Actor */
private String a_name;
public MovieInfo(SQLiteDatabase db) {
this.db = db;
MovieInfo movie;
String[] fields = new String[] {"m_id, m_title, m_rate, c_id, m_director"};
Cursor c = db.query("movie", fields, null, null, null, null, null);
if (c.moveToFirst()) {
//List all results
do {
movie = new MovieInfo(c.getInt(0), c.getString(1), c.getInt(2), c.getInt(3), c.getString(4));
getArrayMovieInfo().add(movie);
} while(c.moveToNext());
}
}
}
Logcat输出测试1
08-18 14:00:45.230 15666-15666 / com.example。 .movieticket D / 1。对象识别 - &gt;:True 08-18 14:00:45.230 15666-15666 / com.example。 .movieticket D / 1。对象内容:Ex Machina您的速度:3.0 / 5 2015-08-03 21:30:00来自赫尔辛基的Maxim
Logcat输出测试2
08-18 14:00:45.339 15666-15666 / com.example。 .movieticket D / 2。对象识别 - &gt;:错误 08-18 14:00:45.339 15666-15666 / com.example。 .movieticket D / 2。对象内容:Ex Machina你的速度:3.0 / 5 2015-08-03 21:30:00来自赫尔辛基的Maxim
Logcat输出以检查Arraylist内容
/com.example。 .movieticket D / ARRAY MOVIE CONTENT :: Ex Machina /com.example..movieticket D / ARRAY MOVIE CONTENT :: Birdman /com.example.*.movieticket D / ARRAY MOVIE CONTENT :: Titre
答案 0 :(得分:0)
好的,重点是将一个对象从一个活动传递到另一个,因为该对象已经有一些数据将在第二个活动中使用。 即使第二个活动中收到的对象与ArrayList中的一个包含相同的数据,由于序列化,它们也不再是同一个实例。
这就是为什么我最终选择只传递电影的id而不是序列化对象。
答案 1 :(得分:0)
您应该使用parcelable将对象列表从一个活动发送到另一个活动。参见示例
Pass list of objects from one activity to other activity in android