我有两个活动,MainActivity
和MovieDetail
和一个java类MovieInfo
。
MovieInfo
正确地初始化了static ArrayList< MovieInfo >
和MovieInfo
实例。
MainActivity
从MovieInfo
中存储的static ArrayList
中选择一个实例化对象,然后通过putExtra
方法将其传递给MovieDetail
活动。
当我尝试在MainActivity
的static ArrayList
中使用contains
方法与先前选择的实例化对象时,它正在工作。
为什么当我尝试从MovieDetail
与通过putExtra
方法从MainActivity
接收的对象相同时,它不再识别它了?
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输出Test 1
08-18 14:00:45.230 15666-15666/com.example.。movieticket D/1。对象识别->:True[08-18] 14:00:45.230 15666-15666/com.example.。movieticket D/1。对象内容:Ex Machina Your Rate: 3.0/5 2015-08-03 21:30:00 from Maxim at Helsinki
Logcat输出Test 2
08-18 14:00:45.339 15666-15666/com.example.。movieticket D/2。对象识别->:False08-18 14:00:45.339 15666-15666/com.example.。movieticket D/2。对象内容:Ex Machina你的比率:3.0/52015-08-03 21:30:00 from Maxim at Helsinki
检查Arraylist内容的Logcat输出
com . example。/。电影票D/ARRAY电影内容:机械姬com . example。/。D/ARRAY电影内容:鸟人com . example。/*。movieticket D/ARRAY MOVIE CONTENT:: Titre
好的,重点是传递一个对象从一个活动到另一个,因为这个对象已经有一些数据,将在第二个活动中使用。即使在第二个活动中接收到的对象与ArrayList中包含的对象具有相同的数据,由于序列化,它们也不再是相同的实例。
这就是为什么我最终选择只传递电影的id而不是序列化对象的原因。
您应该使用parcelable将对象列表从一个活动发送到另一个活动。参见示例
传递对象列表从一个活动到另一个活动在android