diff --git a/src/main/java/de/blau/android/osm/RelationMemberDescription.java b/src/main/java/de/blau/android/osm/RelationMemberDescription.java index 783c52183a..d6b5098bc1 100644 --- a/src/main/java/de/blau/android/osm/RelationMemberDescription.java +++ b/src/main/java/de/blau/android/osm/RelationMemberDescription.java @@ -104,10 +104,10 @@ public int getPosition() { /** * Set the position of the member in the Relation * - * @param postiion the position to set + * @param postion the position to set */ - public void setPosition(int postiion) { - this.position = postiion; + public void setPosition(int postion) { + this.position = postion; } @Override @@ -135,7 +135,7 @@ public int hashCode() { * @throws IOException if writing fails */ private void writeObject(java.io.ObjectOutputStream out) throws IOException { - super.setElement(null); // don't save the actual relation ref + super.setElement(null); // don't save the actual object out.defaultWriteObject(); } diff --git a/src/main/java/de/blau/android/propertyeditor/PropertyEditorData.java b/src/main/java/de/blau/android/propertyeditor/PropertyEditorData.java index e9bf793675..99151490bf 100644 --- a/src/main/java/de/blau/android/propertyeditor/PropertyEditorData.java +++ b/src/main/java/de/blau/android/propertyeditor/PropertyEditorData.java @@ -26,7 +26,8 @@ public class PropertyEditorData implements Serializable { private static final long serialVersionUID = 5L; - private static final String DEBUG_TAG = PropertyEditorData.class.getSimpleName().substring(0, Math.min(23, PropertyEditorData.class.getSimpleName().length())); + private static final String DEBUG_TAG = PropertyEditorData.class.getSimpleName().substring(0, + Math.min(23, PropertyEditorData.class.getSimpleName().length())); public final long osmId; public final String type; @@ -100,9 +101,12 @@ static MultiHashMap<Long, RelationMemberPosition> getParentMap(@NonNull OsmEleme * @return the List */ static <T extends List<RelationMemberDescription>> T getRelationMemberDescriptions(@NonNull Relation relation, @NonNull T members) { + int position = 0; for (RelationMember rm : relation.getMembers()) { RelationMemberDescription newRm = new RelationMemberDescription(rm); + newRm.setPosition(position); members.add(newRm); + position++; } return members; } diff --git a/src/main/java/de/blau/android/propertyeditor/RelationMembersFragment.java b/src/main/java/de/blau/android/propertyeditor/RelationMembersFragment.java index bb42ed5fb7..1924529778 100644 --- a/src/main/java/de/blau/android/propertyeditor/RelationMembersFragment.java +++ b/src/main/java/de/blau/android/propertyeditor/RelationMembersFragment.java @@ -240,15 +240,18 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c public void onDataUpdate() { Log.d(DEBUG_TAG, "onDataUpdate"); Relation r = (Relation) propertyEditorListener.getElement(); - List<MemberEntry> tempEntries = new ArrayList<>(); + List<MemberEntry> currentEntries = new ArrayList<>(); final ArrayList<RelationMemberDescription> currentMembers = PropertyEditorData.getRelationMemberDescriptions(r, new ArrayList<>()); - getMemberEntries(currentMembers, tempEntries); - setIcons(tempEntries); - if (!tempEntries.equals(membersInternal)) { + getMemberEntries(currentMembers, currentEntries); + setIcons(currentEntries); + // relations can be very large and this might cause issues on the stack + List<RelationMemberDescription> origMembers = savingHelper.load(getContext(), Long.toString(id) + FILENAME_ORIG_MEMBERS, true); + // only update our copy if the relation members have actually changed from the original state + if (!currentMembers.equals(origMembers) && !currentEntries.equals(membersInternal)) { Log.d(DEBUG_TAG, "onDataUpdate current members have changed"); ScreenMessage.toastTopInfo(getContext(), R.string.toast_updating_members); membersInternal.clear(); - membersInternal.addAll(tempEntries); + membersInternal.addAll(currentEntries); adapter.notifyDataSetChanged(); savingHelper.save(getContext(), Long.toString(id) + FILENAME_ORIG_MEMBERS, currentMembers, true); }