0

パーセル可能なクラスに変換したい次のクラスがあります。このチュートリアルこのスレッドに従ってみましたが、行き詰まりました。おそらく、あなたは私を正しい方向に押し出すことができますか?

現在のクラス

import java.util.ArrayList;

public class SimpleBookManager implements BookManager {

    private ArrayList<Book> allBooks = new ArrayList<Book>();

    public ArrayList<Book> getAllBooks(){
    return  allBooks;
    }   
    public int count(){
        return getAllBooks().size();
    }
    public Book getBook(int index){
        return allBooks.get(index);
    }
    public Book createBook(){
        Book book = new Book();
        allBooks.add(book);
        return book;
    }
    public void removeBook(Book book){
        allBooks.remove(book);
        //Remove instance of book
    }
    public void moveBook (int from, int to){
        Book book1 = allBooks.get(from);
        Book book2 = allBooks.get(to);
        allBooks.add(to, book1);
        allBooks.add(from, book2);

    }
    public int getMinPrice(){
    ArrayList<Integer> allPrices = getAllPrices();
    int smallestElem=allPrices.get(0);
    for(int i=0; i < allPrices.size(); i++){
         if (smallestElem > allPrices.get(i)){
             smallestElem = allPrices.get(i);
         }
      }
        return smallestElem;    
    }
    public int getMaxPrice(){
        ArrayList<Integer> allPrices = getAllPrices();
        int biggestElem=allPrices.get(0);
        for(int i=0; i < allPrices.size(); i++){
             if (biggestElem < allPrices.get(i)){
                 biggestElem = allPrices.get(i);
             }
          }
            return biggestElem; 
    }
    public float getMeanPrice(){
        ArrayList<Integer> allPrices = getAllPrices();
        int total=0;
        for(int i=0; i < allPrices.size(); i++){
             total+=allPrices.get(i);
          }
            return total/allPrices.size();  

    }
    public int getTotalCost(){
        ArrayList<Integer> allPrices = getAllPrices();
        int total=0;
        for(int i=0; i < allPrices.size(); i++){
             total+=allPrices.get(i);
          }
            return total;
    }
    public void saveChanges(){
        //What to do here
    }
    private ArrayList<Integer> getAllPrices(){
        int totalElements = allBooks.size();
        ArrayList<Integer> allBookPrices = new ArrayList<Integer>();
        //loop through it
        for(int i=0; i < totalElements; i++){
          allBookPrices.add(allBooks.get(i).getPrice());
        }
        return allBookPrices;
    }

    public SimpleBookManager(){
        Book harryPotter1 = createBook();
        Book harryPotter2 = createBook();

        harryPotter1.setAuthor("JK Rowling");
        harryPotter1.setCourse("Harry Potter Kunskap");
        harryPotter1.setPrice(199);
        harryPotter1.setTitle("Harry Potter and the philosifer Stone");
        harryPotter1.setIsbn("9780590353403");

        harryPotter2.setAuthor("JK Rowling");
        harryPotter2.setCourse("Harry Potter Kunskap");
        harryPotter2.setPrice(299);
        harryPotter2.setTitle("Harry Potter and snake");
        harryPotter2.setIsbn("0439064872");
    }
}

どこまで来たか

import android.os.Parcel;
import android.os.Parcelable;
import java.util.ArrayList;

public class SimpleBookManager implements BookManager, Parcelable{

    private ArrayList<Book> allBooks = new ArrayList<Book>();

    public ArrayList<Book> getAllBooks(){
    return  allBooks;
    }   
    public int count(){
        return getAllBooks().size();
    }
    public Book getBook(int index){
        return allBooks.get(index);
    }
    public Book createBook(){
        Book book = new Book();
        allBooks.add(book);
        return book;
    }
    public void removeBook(Book book){
        allBooks.remove(book);
        //Remove instance of book
    }
    public void moveBook (int from, int to){
        Book book1 = allBooks.get(from);
        Book book2 = allBooks.get(to);
        allBooks.add(to, book1);
        allBooks.add(from, book2);  
    }
    public int getMinPrice(){
    ArrayList<Integer> allPrices = getAllPrices();
    int smallestElem=allPrices.get(0);
    for(int i=0; i < allPrices.size(); i++){
         if (smallestElem > allPrices.get(i)){
             smallestElem = allPrices.get(i);
         }
      }
        return smallestElem;    
    }
    public int getMaxPrice(){
        ArrayList<Integer> allPrices = getAllPrices();
        int biggestElem=allPrices.get(0);
        for(int i=0; i < allPrices.size(); i++){
             if (biggestElem < allPrices.get(i)){
                 biggestElem = allPrices.get(i);
             }
          }
            return biggestElem; 
    }
    public float getMeanPrice(){
        ArrayList<Integer> allPrices = getAllPrices();
        int total=0;
        for(int i=0; i < allPrices.size(); i++){
             total+=allPrices.get(i);
          }
            return total/allPrices.size();  

    }
    public int getTotalCost(){
        ArrayList<Integer> allPrices = getAllPrices();
        int total=0;
        for(int i=0; i < allPrices.size(); i++){
             total+=allPrices.get(i);
          }
            return total;
    }
    public void saveChanges(){
        //What to do here
    }
    private ArrayList<Integer> getAllPrices(){
        int totalElements = allBooks.size();
        ArrayList<Integer> allBookPrices = new ArrayList<Integer>();
        //loop through it
        for(int i=0; i < totalElements; i++){
          allBookPrices.add(allBooks.get(i).getPrice());
        }
        return allBookPrices;
    }

    public SimpleBookManager(){
        Book harryPotter1 = createBook();
        Book harryPotter2 = createBook();

        harryPotter1.setAuthor("JK Rowling");
        harryPotter1.setCourse("Harry Potter Kunskap");
        harryPotter1.setPrice(199);
        harryPotter1.setTitle("Harry Potter and the philosifer Stone");
        harryPotter1.setIsbn("9780590353403");

        harryPotter2.setAuthor("JK Rowling");
        harryPotter2.setCourse("Harry Potter Kunskap");
        harryPotter2.setPrice(299);
        harryPotter2.setTitle("Harry Potter and snake");
        harryPotter2.setIsbn("0439064872");
    }

    //parcel part, not finished_________________________________________________________________________________
    public SimpleBookManager(Parcel in){
    //...Incomplete
    }
    @Override
    public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub

    dest.writeStringArray(new String[]{this.UserName,this.Password,String.valueOf(this.Action)});
    }

    public static final Parcelable.Creator<SimpleBookManager> CREATOR= new Parcelable.Creator<SimpleBookManager>() {

    @Override
    public SimpleBookManager createFromParcel(Parcel source) {
    // TODO Auto-generated method stub
    return new SimpleBookManager(source);  //using parcelable constructor
    }

    @Override
    public SimpleBookManager[] newArray(int size) {
    // TODO Auto-generated method stub
    return new SimpleBookManager[size];
    }
    };  
}

拡張的な回答を求めるのは大変なことだと思いますが、おそらくコンストラクターがどのように見えるべきか、そしてどのように行われたかを確認できるようにいくつかの方法を教えてください。 . ありがとう =)

4

1 に答える 1

1

aの原則はParcelable、オブジェクトがその状態をパーセルにシリアル化し、そこから再び逆シリアル化できることです。ストリームからのオブジェクトの書き込みと読み取りと比較してください。実際、この考え方はSerializableインターフェースと非常に似ているため、代わりに多くのQ&Aが言及Serializableされています。ほとんどの場合、開発者の努力をほとんど必要としないため、これが最も簡単なソリューションです。ただし、ParcelableAndroidでは多くの場合より効率的に使用できます。

とにかく、私はあなた自身のコードスニペットを使用して簡単な実装例を書きました。注意すべき点:

  1. 簡単にするために、BookManagerインターフェイスを削除しました。
  2. Bookクラスをリバースエンジニアリングしました。不完全である可能性が非常に高いですが、この例では十分なはずです。
  3. SimpleBookManagerのコンストラクターから2冊のハリーポッターの本を削除しました。

manager以下の例では、次のようなことを実行して、との同じコンテンツを表示できるはずですparcelledManager

// create manager and two example books
SimpleBookManager manager = new SimpleBookManager();
Book harryPotter1 = manager.createBook();
Book harryPotter2 = manager.createBook();

harryPotter1.setAuthor("JK Rowling");
harryPotter1.setCourse("Harry Potter Kunskap");
harryPotter1.setPrice(199);
harryPotter1.setTitle("Harry Potter and the philosifer Stone");
harryPotter1.setIsbn("9780590353403");

harryPotter2.setAuthor("JK Rowling");
harryPotter2.setCourse("Harry Potter Kunskap");
harryPotter2.setPrice(299);
harryPotter2.setTitle("Harry Potter and snake");
harryPotter2.setIsbn("0439064872");

// let's use an intent to parcel the manager to
Intent intent = new Intent();
intent.putExtra("extra_book_manager", manager);

// read the parcelled manager back from the intent
SimpleBookManager parcelledManager = intent.getParcelableExtra("extra_book_manager"); 

SimpleBookManager(そしてBookネストされた静的クラスとして)、両方とも実装Parcelable

public class SimpleBookManager implements Parcelable{

    /****************************
     *  Book
     ****************************/

    public static class Book implements Parcelable {
        private String mAuthor, mTitle, mIsbn, mCourse;
        private int mPrice;

        public Book() { /* empty */ }

        public Book(Parcel in) {
            // read all fields back from the parcel
            mAuthor = in.readString();
            mTitle = in.readString();
            mIsbn = in.readString();
            mCourse = in.readString();
            mPrice = in.readInt();
        }

        public String getAuthor() {
            return mAuthor;
        }
        public String getTitle() {
            return mTitle;
        }
        public String getIsbn() {
            return mIsbn;
        }
        public String getCourse() {
            return mCourse;
        }
        public int getPrice() {
            return mPrice;
        }
        public void setAuthor(String author) {
            mAuthor = author;
        }
        public void setTitle(String title) {
            mTitle = title;
        }
        public void setIsbn(String isbn) {
            mIsbn = isbn;
        }
        public void setCourse(String course) {
            mCourse = course;
        }
        public void setPrice(int price) {
            mPrice = price;
        }

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

        @Override public void writeToParcel(Parcel out, int flags) {
            // write all fields to the parcel 
            out.writeString(mAuthor);
            out.writeString(mTitle);
            out.writeString(mIsbn);
            out.writeString(mCourse);
            out.writeInt(mPrice);
        }

        public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {
            @Override public Book createFromParcel(Parcel source) {
                return new Book(source);
            }

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

    /****************************
     *  BookManager
     ****************************/

    private ArrayList<Book> allBooks = new ArrayList<Book>();

    public SimpleBookManager() { /* empty */ }

    public SimpleBookManager(Parcel in) {
        // read all the books from the parcel as a typed list 
        in.readTypedList(allBooks, Book.CREATOR);
    }

    public ArrayList<Book> getAllBooks(){
        return  allBooks;
    }   

    public int count(){
        return getAllBooks().size();
    }

    public Book getBook(int index){
        return allBooks.get(index);
    }

    public Book createBook(){
        Book book = new Book();
        allBooks.add(book);
        return book;
    }

    public void removeBook(Book book){
        allBooks.remove(book);
    }

    public void moveBook (int from, int to){
        Book book1 = allBooks.get(from);
        Book book2 = allBooks.get(to);
        allBooks.add(to, book1);
        allBooks.add(from, book2);  
    }

    public int getMinPrice(){
        ArrayList<Integer> allPrices = getAllPrices();
        int smallestElem=allPrices.get(0);
        for(int i=0; i < allPrices.size(); i++){
            if (smallestElem > allPrices.get(i)){
                smallestElem = allPrices.get(i);
            }
        }
        return smallestElem;    
    }

    public int getMaxPrice(){
        ArrayList<Integer> allPrices = getAllPrices();
        int biggestElem=allPrices.get(0);
        for(int i=0; i < allPrices.size(); i++){
            if (biggestElem < allPrices.get(i)){
                biggestElem = allPrices.get(i);
            }
        }
        return biggestElem; 
    }

    public float getMeanPrice(){
        ArrayList<Integer> allPrices = getAllPrices();
        int total=0;
        for(int i=0; i < allPrices.size(); i++){
            total+=allPrices.get(i);
        }
        return total/allPrices.size();  

    }

    public int getTotalCost(){
        ArrayList<Integer> allPrices = getAllPrices();
        int total=0;
        for(int i=0; i < allPrices.size(); i++){
            total+=allPrices.get(i);
        }
        return total;
    }

    public void saveChanges(){
        //What to do here
    }

    private ArrayList<Integer> getAllPrices(){
        int totalElements = allBooks.size();
        ArrayList<Integer> allBookPrices = new ArrayList<Integer>();
        //loop through it
        for(int i=0; i < totalElements; i++){
            allBookPrices.add(allBooks.get(i).getPrice());
        }
        return allBookPrices;
    }

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

    @Override public void writeToParcel(Parcel out, int flags) {
        // write all books as a typed list into the parcel
        out.writeTypedList(allBooks);
    }

    public static final Parcelable.Creator<SimpleBookManager> CREATOR= new Parcelable.Creator<SimpleBookManager>() {

        @Override public SimpleBookManager createFromParcel(Parcel source) {
            return new SimpleBookManager(source);
        }

        @Override public SimpleBookManager[] newArray(int size) {
            return new SimpleBookManager[size];
        }
    };  
}
于 2012-11-17T04:53:06.877 に答える