2016-11-19 7 views
0

У меня есть связанный список в одном действии (A), который я хочу разделить с другой деятельностью (B). Список содержит имя пользователя строки типа и содержит координаты типа LatLng. Я также использую Intent и bundle для обмена данными между действиями. Я попытался использовать Parcelable, но не смог понять, как его использовать. Вот код, у меня есть:Pass LinkedList для другой деятельности

data.java

public class data implements Parcelable{ 
    private LatLng coordinates; 
    private String name; 


    public data() { 
     name = null; 
     coordinates = null; 
    } 

    public data(String name, LatLng coordinates) 
    { 
     this.name = name; 
     this.coordinates = coordinates; 
    } 

    public data(Parcel in) { 
     coordinates = in.readParcelable(LatLng.class.getClassLoader()); 
     name = in.readString(); 
    } 

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

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

    public LatLng getLatLng() { 
     return coordinates; 
    } 

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

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(name); 
     dest.writeParcelable(coordinates, flags); 
    } 
} 

активность

public class A extends FragmentActivity implements 
    OnMapReadyCallback, 
    GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, 
    GoogleMap.OnMyLocationButtonClickListener, 
    ActivityCompat.OnRequestPermissionsResultCallback { 

    Button switchToSeek; 
    double mLatitude; 
    double mLongitude; 

    LinkedList<data> storedData = new LinkedList<>(); 

    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     switchToSeek.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         getCurrentLocation(); 

         Intent intent = new Intent(A.this, B.class); 

         Bundle xy = new Bundle(); 
         xy.putDouble("x", mLatitude); 
         xy.putDouble("y", mLongitude); 
         xy.putParcelable("list", storedData); <---------- error: wrong second arugment 

         intent.putExtra("xy", xy); 
         A.this.startActivity(intent); 
        } 
       }); 

активности B

public class B extends FragmentActivity implements OnMapReadyCallback { 

    double mLatitude; 
    double mLongitude; 
    LatLng current; 
    GoogleMap gMap; 

    LinkedList <data> copyData = new LinkedList<>(); 

    @Override 
     public void onMapReady(GoogleMap googleMap) { 
      gMap = googleMap; 

      ... 

      Intent intent = getIntent(); 
      Bundle xy = intent.getBundleExtra("xy"); 

      if (xy != null) { 
       mLatitude = xy.getDouble("x"); 
       mLongitude = xy.getDouble("y"); 
      } 
      /***** Call linked list here and set equal to copyData *****/ 

      current = new LatLng(mLatitude, mLongitude); 
      gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(current, 18.0f)); 

     } 
+0

Вы можете преобразовать свой список в массив, а затем в строку. передайте эту строку с намерением для ее действия, разделите ее на «,» и сохраните элементы в другом массиве, идите по этому массиву и добавьте элементы в ваш arraylist в другой активности. – HaroldSer

ответ

1

Там нет простого способа сделать это, так как LinkedList не реализует сериализуемую или разборчивую.

Вы МОЖЕТЕ реализовать свой собственный класс связанных списков и сделать его сериализуемым/пакетным объектом, который затем может быть передан.

Или вы можете преобразовать его содержимое в другой тип данных, такие как массив, а затем воссоздать LinkedList. * ЭТО ДАЛЕКО НЕЭФФЕКТИВНЫМ

Я считаю, есть и другие способы, но это стандартная проблема разработчиков Android. Может быть, попробовать использовать фрагменты, если это возможно, и передавая LinkedList через сеттер()

+0

Да, я это заметил. Все функции для связки или намерения, которые я хотел бы использовать, относятся к arrayList. И я думал о преобразовании, но, как вы сказали, это очень неэффективно, особенно если я хочу хранить много данных в списке –

0

Если список не огромный, вы можете это сделать, используя следующий вспомогательный класс:

public class ParcelableLinkedList<E extends Parcelable> implements Parcelable { 

    private final LinkedList<E> linkedList; 

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

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

    public ParcelableLinkedList(Parcel in) { 
     // Read size of list 
     int size = in.readInt(); 
     // Read the list 
     linkedList = new LinkedList<E>(); 
     for (int i = 0; i < size; i++) { 
      linkedList.add((E)in.readParcelable(ParcelableLinkedList.class.getClassLoader())); 
     } 

    } 

    public ParcelableLinkedList(LinkedList<E> linkedList) { 
     this.linkedList = linkedList; 
    } 

    LinkedList<E> getLinkedList() { 
     return linkedList; 
    } 

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

    @Override 
    public void writeToParcel(Parcel parcel, int flags) { 
     // Write size of the list 
     parcel.writeInt(linkedList.size()); 
     // Write the list 
     for (E entry : linkedList) { 
      parcel.writeParcelable(entry, flags); 
     } 
    } 
} 

В вашем методе onClick(), добавьте данные в Bundle, как это:

xy.putParcelable("list", new ParcelableLinkedList<data>(storedData)); 

чтобы извлечь данные из Bundle, сделайте следующее:

copyData = ((ParcelableLinkedList<data>)xy.getParcelable("list")).getLinkedList(); 

Я на самом деле не скомпилировал и протестировал этот код, но он должен работать.

Если список действительно огромный, вам лучше хранить его в переменной-члене static в одном классе, а затем просто ссылаться на него с другого. Обычно это не так, как вы хотите делать на Android, но иногда это целесообразнее, чем сериализовать и десериализовать огромное количество данных, чтобы передать его между двумя действиями, имеющими доступ к одному и тому же пространству памяти.

+0

Я получил java.util.ConcurrentModificationException на @Override public void writeToParcel (Parcel parcel, int flags) { // Записываем размер списка parcel.writeInt (linkedList.size()); // Написать список для (E entry: linkedList) { parcel.writeParcelable (запись, флаги); } } –

 Смежные вопросы

  • Нет связанных вопросов^_^