簡體   English   中英

幫助通過 ArrayList 和 parcelable Activity

[英]Help with passing ArrayList and parcelable Activity

所以我昨天和昨晚的大部分時間都在谷歌上搜索,但似乎無法理解如何將 arraylist 傳遞給子活動。 有大量傳遞原始數據類型的示例和片段,但我擁有的是地址類型的 arraylist(地址如下)。

我在 stackoverflow 和 web 上發現了很多東西,但除了一個 GeoPoint 示例之外,沒有什么引起很多關注。 再一次,在我看來,他們只是將 GeoPoint object 扁平化為兩個整數並將其傳入。我不能這樣做,因為我的地址 class 可能會擴展到包括整數、浮點數等。 現在,為了簡單起見,下面的測試應用程序只有兩個字符串。 我想如果我能得到parcelalbe的東西,rest 可能會緊隨其后。

有人可以為非原始 object 的 ArrayList 發布一個工作示例,或者在下面添加代碼以使其工作嗎?

更新:下面的代碼現在在回復/編輯后工作。 謝謝!

/* helloParcel.java */        
       public class helloParcel extends Activity
{
    // holds objects of type 'address' == name and state
    private ArrayList <address> myList;

    @Override
    public void onCreate (Bundle savedInstanceState)
    {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.main);

        Button b1 = (Button) findViewById(R.id.button1);
        b1.setOnClickListener(ocl);

        myList = new ArrayList();
        address frank   = new address ("frank", "florida");
        address mary    = new address ("mary", "maryland");
        address monty   = new address ("monty", "montana");

        myList.add (frank);
        myList.add (mary);
        myList.add (monty);

        // add the myList ArrayList() the the extras for the intent

    }

    OnClickListener ocl = new OnClickListener() 
    {

        @Override
        public void onClick(View v) 
        {
            // fill parceable and launch activity
            Intent intent = new Intent().setClass(getBaseContext (), subActivity.class);

            // for some reason, I remember a posting saying it's best to create a new
            // object to pass.  I have no idea why..
            ArrayList <address> addyExtras = new ArrayList <address>();

            for (int i = 0; i < myList.size(); i++)
                addyExtras.add (myList.get(i));

            intent.putParcelableArrayListExtra ("mylist", addyExtras);
            startActivity(intent);
        }
    };
} 



/* address.java */
  public class address implements Parcelable
{
    private String name;
    private String state;
    private static String TAG = "** address **";

    public address (String n, String s)
    {
        name = n;
        state = s;
        Log.d (TAG, "new address");
    }

    public address (Parcel in)
   {
    Log.d (TAG, "parcel in");
        name = in.readString ();
        state = in.readString ();
   }

    public String getState ()
    {
        Log.d (TAG, "getState()");
        return (state);
    }

    public String getName ()
    {
        Log.d (TAG, "getName()");
        return (name);
    }

    public static final Parcelable.Creator<address> CREATOR
    = new Parcelable.Creator<address>() 
   {
         public address createFromParcel(Parcel in) 
         {
            Log.d (TAG, "createFromParcel()");
             return new address(in);
         }

         public address[] newArray (int size) 
         {
            Log.d (TAG, "createFromParcel() newArray ");
             return new address[size];
         }
    };

    @Override
   public int describeContents ()
   {
        Log.d (TAG, "describe()");
       return 0;
   }

    @Override
   public void writeToParcel (Parcel dest, int flags)
   {
        Log.d (TAG, "writeToParcel");
       dest.writeString (name);
       dest.writeString (state);
   }

}


/* subActivity.java */
  public class subActivity extends Activity
{
    private final String TAG = "** subActivity **";
    private ArrayList <address> myList;

    @Override
    protected void onCreate (Bundle savedInstanceState)
    {
       super.onCreate (savedInstanceState);
       Log.d (TAG, "onCreate() in subActivity");

       setContentView(R.layout.subactivity);
       TextView tv1 = (TextView) findViewById(R.id.tv_sub);

       myList = getIntent().getParcelableArrayListExtra ("mylist");
       Log.d (TAG, "got myList");

       for (int i = 0; i < myList.size (); i++)
       {
        address a = myList.get (i);
        Log.d (TAG, "state:" + a.getState ());
        tv1.setText (a.getName () + " is from " + a.getState ());
       }

    }

}

我可以在這里看到一些問題:

  1. 為什么使用 addressParcelable? 為什么不讓地址實現 Parcelable,然后使用:

     intent.putParcelableArrayListExtra( "addresses", addyExtras );
  2. 您的可包裹 object 必須包含 static CREATOR。 有關詳細信息,請參閱文檔

  3. 在調用startActivity()之前,您實際上並沒有向意圖添加任何額外內容。 有關建議,請參見第 1 點。

我認為您需要解決所有這些問題才能使其正常工作。

它可以做得更簡單,沒有實現Parcelable的所有痛苦...... ArrayList (但不是任何List )是Serializable 因此,正如 Sam 所說,您可以使用 putExtra() 放置整個列表並使用getSerializableExtra() putExtra()檢索它。

但是,我想添加一件更重要的事情:您的數組列表存儲的 object 還必須實現Serializable ......以及 object 可能包含的所有其他復雜對象(在您的情況下沒有)也必須實現它(所以它是遞歸的 -為了序列化 object,您必須能夠序列化其所有字段)。

現在,您可能會問自己,既然已經有了讀寫 parcelable 數組列表的方法,為什么還要實現Serializable而不是Parcelable 嗯......不同之處在於簡單 - 只需添加implements Serializable和可選private static final long serialVersionUID = SOME_CONSTANT ,你就完成了! 這就是我從不使用Parcelable的原因——你可以使用Serializable用字面上的 2 行代碼來做所有這些事情——而不是許多方法繼承和所有那些東西......

您可以通過 putExtra 傳遞 Serializable 對象。 ArrayList 實現了可序列化。

邁克 dg 是正確的!

putExtra()getSerializable()將存儲和檢索自定義對象的ArrayList<> ,無需實現接口。 為我工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM