来自 ArrayList 的对象在通过<Object> putExtra 方法传递给另一个活动后,无法通过包含方法识别



我有两个活动,MainActivityMovieDetail和一个java类MovieInfo

MovieInfo正确地初始化了static ArrayList< MovieInfo >MovieInfo实例。

MainActivityMovieInfo中存储的static ArrayList中选择一个实例化对象,然后通过putExtra方法将其传递给MovieDetail活动。

当我尝试在MainActivitystatic 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

最新更新