2016-12-28 14 views
0

我是新來android和java,我工作在這個android項目,我有一個ListView電影(名稱字符串,類型字符串,年 - 詮釋)。我想在將它傳遞給另一個activity後拆分該物品。如何在另一個意圖中拆分傳遞的ListView項目?

我的電影型號:

public class Movie 
{ 
    // property to help us handle the data 
    private int id; 
    private String name; 
    private String genre; 
    private int year; 


    //Getters and Setters of the properties 
    public long getId() 
    { 
     return id; 
    } 

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


    public String getName() 
    { 
     return name; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 


    public String getGenre() 
    { 
     return genre; 
    } 

    public void setGenre(String genre) 
    { 
     this.genre = genre; 
    } 


    public int getYear() 
    { 
     return year; 
    } 

    public void setYear(int year) 
    { 
     this.year = year; 
    } 


    public String toString() 
    { 
     return name + ", " + genre + ", " + year; 
    } 



//----------Start--------- Here we have defined the table contents (basically a blueprint of the table Movie) ------------------------------------- 

    public static final String TABLE_NAME = "movie"; 
    public static final String COlUMN_ID = "id"; 
    public static final String COlUMN_NAME = "make"; 
    public static final String COlUMN_GENRE = "model"; 
    public static final String COlUMN_YEAR = "year"; 

//----------------------END----------------------------------------------------------------------------------------------------------------// 

} 

我創建電影活動:

public class CreateMovieActivity extends AppCompatActivity 
{ 
    MoviesRepository moviesRepository; 

    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_create_movie); 

     moviesRepository = new MoviesRepository(this); 
     moviesRepository.open(); 
    } 

    public void onClickSaveMovie(View v) 
    { 
     Button buttonAdd = (Button) v; 

     EditText editTextName = (EditText) findViewById(R.id.editTextName); 
     EditText editTextGenre = (EditText) findViewById(R.id.editTextGenre); 
     EditText editTextYear = (EditText) findViewById(R.id.editTextYear); 

     Movie movie = new Movie(); 
     movie.setName(editTextName.getText().toString()); 
     movie.setGenre(editTextGenre.getText().toString()); 
     movie.setYear(Integer.parseInt(editTextYear.getText().toString())); 


     moviesRepository.Create(movie); 


     Button buttonCreate = (Button) v; 
     startActivity(new Intent(getBaseContext(),MainActivity.class)); 
    } 

} 

我的電影庫:

public class MoviesRepository 
{ 
    private SQLiteDatabase db; 
    private MyDBHelper myDBHelper; 


    private String [] MovieAllColumns ={Movie.COlUMN_ID, 
      Movie.COlUMN_NAME, 
      Movie.COlUMN_GENRE, 
      Movie.COlUMN_YEAR}; 



    public MoviesRepository(Context context) 
    { 
     myDBHelper = new MyDBHelper(context); 
    } 


    public void open() throws SQLException 
    { 
     //Open connection to write data 
     db = myDBHelper.getWritableDatabase(); 
    } 


    public void close() 
    { 
     //Close connection to database 
     db.close(); 
    } 

    private Movie cursorToMovie (Cursor cursor) 
    { 
     Movie movie = new Movie(); 
     movie.setId(cursor.getInt(0)); 
     movie.setName(cursor.getString(1)); 
     movie.setGenre(cursor.getString(2)); 
     movie.setYear(cursor.getInt(3)); 

     return movie; 
    } 

    public List<Movie> getAllMovies() 
    { 
     open(); 

     List<Movie> movieList = new ArrayList<>(); 
     Cursor cursor = db.query(Movie.TABLE_NAME, MovieAllColumns, null, null, null, null, null); 
     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) 
     { 
      Movie movie = cursorToMovie(cursor); 
      movieList.add(movie); 
      cursor.moveToNext(); 
     } 

     cursor.close(); 
     close(); 
     return movieList; 

    } 



    public void Create(Movie movie) 
    { 
     open(); 

     //helps you insert values to the table 
     ContentValues values = new ContentValues(); 

     //Put method - first column; what column do you want to be storing this ind. Second; what is the value you want to put ind 
     values.put(Movie.COlUMN_NAME, movie.getName()); 
     values.put(Movie.COlUMN_GENRE, movie.getGenre()); 
     values.put(Movie.COlUMN_YEAR, movie.getYear()); 

     db.insert(Movie.TABLE_NAME, null, values); 
     close(); 
    } 


    public void Delete(Movie movie) 
    { 
     open(); 
     //Deletes Movie by id 
     db.delete(Movie.TABLE_NAME, Movie.COlUMN_ID + " = " + movie.getId(), null); 
     db.close(); 
    } 

} 

當我在項目上點擊ListView它會通過價值到另一個Activity我可以打印出來(做烤麪包)。

這是我通過該項目的其他意圖:

public void Select() 
    { 
     moviesRepository = new MoviesRepository(this); 
     moviesRepository.open(); 

     final Movie movie; 

     final ListView listView = (ListView) findViewById(R.id.ListViewMovie); 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
     { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
      { 
       final String details = listView.getAdapter().getItem(position).toString(); 
       Intent i = new Intent(getApplicationContext(), MovieDetailsActivity.class); 
       i.putExtra("key", details); 
       startActivity(i); 

      } 
     }); 

    } 

但我怎麼從ListView分裂傳遞的值,因此它是有道理的。

這是我想它的三個值,電影名稱,電影類型和年份劃分:

public class MovieDetailsActivity extends AppCompatActivity 
{ 
    TextView movieName; 
    TextView movieGenre; 
    TextView movieYear; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.movie_details); 
     getDetails(); 
    } 
    public void getDetails() 
    { 
     movieName = (TextView) findViewById(R.id.textViewMovieName); 
     movieGenre = (TextView) findViewById(R.id.textViewMovieGenre); 
     movieYear = (TextView) findViewById(R.id.textViewMovieYear); 

     String data = getIntent().getExtras().getString("key"); 


     Toast.makeText(this, data, Toast.LENGTH_LONG).show(); 


    } 
} 

現在我只是做舉杯與傳遞的項目

回答

0

創建moviemanager類是單身人士,有map。將電影保存爲<String, Movie>到地圖中。然後您可以撥打Moviemanager.getInstance().getMovie(key)來獲取電影對象。

+0

我想通了,但我不知道如何可以從數據庫(SqlLite)將數據傳遞給其他意圖。或者我怎樣才能比較發送字符串對象與我的數據庫中的數據?這樣我可以獲得該行的所有列。 –

+0

正如我所說,你爲此創建一個經理類。您必須使用數據庫中的數據初始化此經理。然後,您可以將活動中的密鑰發送給另一個人,就像您一樣。在第二個活動中,您可以要求經理爲傳遞的密鑰獲取正確的電影。您的經理和您的數據庫此時具有相同的數據。這就是我在我的應用程序中所做的。 – beeb

0

你在問如何在細節屏幕上分割你收到的字符串。

這是很簡單的實際;-)

在你MovieDetailsActivity#getDetails當你從Intent得到的細節字符串,你需要做到以下幾點:

String data = getIntent().getExtras().getString("key"); 
String[] splitMovieString = data.split(", "); 

然後你可以設置你TextView就像這樣:

movieName.setText(splitMovieString[0]); 
movieGenre.setText(splitMovieString[1]); 
movieYear.setText(splitMovieString[2]); 

在一個側面說明:

將數據作爲字符串發送到Intent的方法是可以的,但它不是Android中在活動之間傳遞數據的首選方式。

有一種方法可以傳遞整個Movie對象,但只有在您更改對象以實現Parcelable接口時纔有效。(見the official documentation for a full example

實施ParcelableMovie物體看起來像這樣經過:

public class Movie implements Parcelable { 
    private int id; 
    private String name; 
    private String genre; 
    private int year; 

    protected Movie(Parcel in) { 
     id = in.readInt(); 
     name = in.readString(); 
     genre = in.readString(); 
     year = in.readInt(); 
    } 

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

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

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

    @Override 
    public void writeToParcel(Parcel parcel, int i) { 
     parcel.writeInt(id); 
     parcel.writeString(name); 
     parcel.writeString(genre); 
     parcel.writeInt(year); 
    } 

    [... Setters, getters and your constants are removed for brevity] 
} 

現在你已經改變了你的模型了一下後,就可以直接通過它通過這樣的Intent系統:

OnClickListener你需要改變你的Intent了一下里面的Select方法:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    final Movie selectedMovie = listView.getAdapter().getItem(position); 
    Intent detailsIntent = new Intent(getApplicationContext(), MovieDetailsActivity.class); 
    detailsIntent.putExtra(Movie.class.getName(), selectedMovie); 
    startActivity(detailsIntent); 
} 

這裏發生的事情是,我們基本上將對象「變平」(或序列化)爲可通過Intent系統發送的對象。 現在,當您在MovieDetailsActivity#getDetails中收到Intent時,您需要再次解開(或反序列化)您的「扁平」Movie對象,以便您可以像使用正常的Movie對象那樣使用它。

所以,現在你MovieDetailsActivity#getDetails應該是這樣的:

public void getDetails() { 
    movieName = (TextView) findViewById(R.id.textViewMovieName); 
    movieGenre = (TextView) findViewById(R.id.textViewMovieGenre); 
    movieYear = (TextView) findViewById(R.id.textViewMovieYear); 

    Movie movie = getIntent().getParcelableExtra(Movie.class.getName()); 
    // Now you can set your movie name, genre and year directly from your object. 
    movieName.setText(movie.getName()); 
    movieGenre.setText(movie.getGenre()); 
    movieYear.setText(String.valueOf(movie.getYear()); // Notice you cannot set an Integer directly as the text of a `TextView`, you need to parse it as a String first. 
} 

我知道這最後的解決方案將帶來更多的代碼添加到您的類,但它確實是這樣做的最好的方式,當你讓你的模型類實現Parcelable界面的Android Studio會告訴你,你缺少的執行和實際問你是否需要實施Parcelable幫助,所以你真的沒有做太多你自己。

最後要注意的還有另一種解決辦法,是隻傳遞當前Movieid通過Intent,然後從MoviesRepository直接在MovieDetailsActivity取,但你也有你的MoviesRepository一個新的延伸方法可以從您的回購中獲取單個Movie

我知道這是一個很長的答案,但也有許多概念照顧這裏:-)

相關問題