ArrayList <object>中的对象在通过putExtra方法传递给另一个活动后,无法通过contains方法识别

时间:2015-08-18 11:09:48

标签: java android arraylist

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

MovieInfo使用static ArrayList< MovieInfo >个实例正确初始化MovieInfo

MainActivitystatic 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。 .movi​​eticket D / 1。对象识别 - &gt;:True   08-18 14:00:45.230 15666-15666 / com.example。 .movi​​eticket 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。 .movi​​eticket D / 2。对象识别 - &gt;:错误   08-18 14:00:45.339 15666-15666 / com.example。 .movi​​eticket D / 2。对象内容:Ex Machina你的速度:3.0 / 5       2015-08-03 21:30:00来自赫尔辛基的Maxim

Logcat输出以检查Arraylist内容

  

/com.example。 .movi​​eticket D / ARRAY MOVIE CONTENT :: Ex Machina    /com.example..movi​​eticket D / ARRAY MOVIE CONTENT :: Birdman    /com.example.*.movi​​eticket D / ARRAY MOVIE CONTENT :: Titre

2 个答案:

答案 0 :(得分:0)

好的,重点是将一个对象从一个活动传递到另一个,因为该对象已经有一些数据将在第二个活动中使用。 即使第二个活动中收到的对象与ArrayList中的一个包含相同的数据,由于序列化,它们也不再是同一个实例。

这就是为什么我最终选择只传递电影的id而不是序列化对象。

答案 1 :(得分:0)

您应该使用parcelable将对象列表从一个活动发送到另一个活动。参见示例

Pass list of objects from one activity to other activity in android