ArrayList Setup erstellen

  • Antworten:6
  • Bentwortet
Aaron B.
  • Forum-Beiträge: 206

03.07.2013, 21:49:08 via App

Hallo zusammen.

Folgendes Problem:

Ich habe einen Custom-Surface-View erstellt. Man kann zu diesem View Koordinatenbündel zu einer ArrayList hinzufügen.

In der Datei CustomView:
1ArrayList<Coordinates> data;
in der void "public CustomView()"
1data = new ArrayList<Coordinates>();
die add-void
1public void addDataItem(Coordinates item) {
2data.add(item);
3}

Diese Koordinatenbündel werden ab und zu verändert aber es soll eine "reset"-Funktion geben, bei der die Items wieder unverändert sind. Daher hatte ich vor, eine Backup-Liste zu erstellen und dann den Inhalt aus ihr zu lesen.

1. Versuch:
1//speichern
2backupdata = data;
3
4//laden
5data = backupdata;
2. Versuch:
1//speichern
2for (Coordinates c : data) {
3backupdata.add (c);
4}
5
6//laden
7for (Coordinates c : backupdata) {
8data.add(c);
9}

Aber aus irgendeinem mir unerklärlichen Grund funktioniert dieser einfache Code nicht, d. h. die Items bleiben verändert.

Ich verstehe nicht, was daran falsch ist... Normalerweise funktioniert das immer.

Meine Frage:

Wie kann ich von meiner Liste ein Backup erstellen und dieses dann wieder problemlos laden?

LG :)

Antworten
impjor
  • Forum-Beiträge: 1.793

03.07.2013, 21:57:33 via App

Ich denke, dass Problem ist, dass nur die Referenzen übergeben werden, nicht die Inhalte.r
Versuche es doch mal mit ArrayList.clone();

Gruß

— geändert am 03.07.2013, 21:57:54

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Aaron B.
  • Forum-Beiträge: 206

03.07.2013, 22:05:15 via App

ok danke :) probier ich gleich aus

Antworten
Aaron B.
  • Forum-Beiträge: 206

03.07.2013, 22:13:35 via App

Es funktioniert immer noch nicht...

1public void mkCls() {
2 clporters = (ArrayList<Coordinates>)porters.clone();
3 clgates = (ArrayList<Coordinates>)gates.clone();
4 }
5
6 public void recallCls() {
7 porters = (ArrayList<Coordinates>)clporters.clone();
8 gates = (ArrayList<Coordinates>)clgates.clone();
9 }

Antworten
Aaron B.
  • Forum-Beiträge: 206

03.07.2013, 22:20:30 via App

Also das ist meine Datei:

1package de.wypepath.classes;
2
3import android.content.*;
4import android.graphics.*;
5import android.os.*;
6import android.view.*;
7import java.util.*;
8
9public class GameView extends PanelView
10{
11
12 Context con;
13 Coordinates standarts;
14
15 Canvas c;
16 Paint p;
17 Boolean motion;
18 Float panelX, panelY;
19 Float cursorX, cursorY;
20 Float lastX, lastY;
21
22 Float milli;
23 Float time;
24 Boolean running;
25
26 ArrayList<Coordinates> routes;
27 ArrayList<Coordinates> antiRoutes;
28 ArrayList<Coordinate> fakeGoals;
29 ArrayList<Coordinates> porters;
30 ArrayList<Coordinates> gates;

31 ArrayList<Coordinates> wires;
32 ArrayList<Coordinate> buttons;
33
34 ArrayList<Coordinates> clporters;
35 ArrayList<Coordinates> clgates;

36
37 OnActionListener listener;
38
39 public GameView(Context con, Coordinates standarts) {
40 super(con);
41
42 this.con = con;
43 this.standarts = standarts;
44
45 milli = 0.0f;
46 time = 0.0f;
47 running = false;
48
49 setBackgroundResource(de.wypepath.R.drawable.background);
50
51 routes = new ArrayList<Coordinates>();
52 antiRoutes = new ArrayList<Coordinates>();
53 fakeGoals = new ArrayList<Coordinate>();
54 porters = new ArrayList<Coordinates>();
55 gates = new ArrayList<Coordinates>();

56 wires = new ArrayList<Coordinates>();
57 buttons = new ArrayList<Coordinate>();
58
59 clporters = new ArrayList<Coordinates>();
60 clgates = new ArrayList<Coordinates>();
61 }

62
63 public void mkCls() {
64 clporters = (ArrayList<Coordinates>)porters.clone();
65 clgates = (ArrayList<Coordinates>)gates.clone();
66 }
67
68 public void recallCls() {
69 porters = (ArrayList<Coordinates>)clporters.clone();
70 gates = (ArrayList<Coordinates>)clgates.clone();
71 }

72
73 public void setOnActionListener(OnActionListener listener) {
74 this.listener = listener;
75 }
76
77 public void addRoute(Coordinates route) {
78 routes.add(route);
79 }
80
81 public void addAntiRoute(Coordinates antiRoute) {
82 antiRoutes.add(antiRoute);
83 }
84
85 public void addFakeGoal(Coordinate fakeGoal) {
86 fakeGoals.add(fakeGoal);
87 }
88
89 public void addPorter(Coordinates porter) {
90 porters.add(porter);
91 mkCls();
92 }
93
94 public void addGate(Coordinates gate) {
95 gates.add(gate);
96 mkCls();
97 }
98
99 public void addWire(Coordinates wire) {
100 wires.add(wire);
101 }
102
103 public void addButton(Coordinate button) {
104 button.setLocked(false);
105 buttons.add(button);
106 }
107
108 public float getTimeMillis() {
109 return milli;
110 }
111
112 public float getTimeSec() {
113 time = milli / 1000;
114
115 return time;
116 }
117
118 @Override
119 public void onDraw(Canvas canv) {
120 c = canv;
121
122 if(p == null) {
123 p = new Paint();
124 }
125 if(panelX == null) {
126 panelX = Float.valueOf(c.getWidth());
127 }
128 if(panelY == null) {
129 panelY = Float.valueOf(c.getHeight());
130 }
131 if(cursorX == null) {
132 cursorX = standarts.getStartX();
133 }
134 if(cursorY == null) {
135 cursorY = standarts.getStartY();
136 }
137 if(motion == null) {
138 motion = false;
139 }
140
141 //c.drawColor(Color.BLACK);
142
143 p.setStyle(Paint.Style.STROKE);
144 p.setStrokeWidth(0);
145 p.setColor(Color.WHITE);
146 //c.drawRect(panelX / 2 - 15, 50 - 15, panelX / 2 + 15, panelY - 50 + 15, p);
147
148 for(Coordinates coo : routes) {
149 c.drawRect(coo.getStartX(), coo.getStartY(), coo.getEndX(), coo.getEndY(), p);
150 }
151
152 p.setColor(Color.parseColor(FileCommands.C_ORANGE));
153
154 for(Coordinates coo : antiRoutes) {
155 c.drawRect(coo.getStartX(), coo.getStartY(), coo.getEndX(), coo.getEndY(), p);
156 }
157
158 p.setColor(Color.parseColor("#FF9999"));
159
160 for(Coordinate coo : fakeGoals) {
161 c.drawCircle(coo.getX(), coo.getY(), 50, p);
162 c.drawRect(coo.getX() - 50, coo.getY() - 50, coo.getX() + 50, coo.getY() + 50, p);
163 }
164
165 p.setColor(Color.parseColor("#FFFF00"));
166
167 for(Coordinates coo : porters) {
168 c.drawRect(coo.getStartX() - 50, coo.getStartY() - 50, coo.getStartX() + 50, coo.getStartY() + 50, p);
169 c.drawCircle(coo.getStartX(), coo.getStartY(), 50, p);
170 c.drawCircle(coo.getStartX(), coo.getStartY(), 25, p);
171 c.drawRect(coo.getEndX() - 25, coo.getEndY() - 25, coo.getEndX() + 25, coo.getEndY() + 25, p);
172 c.drawLine(coo.getEndX() - 25, coo.getEndY() - 25, coo.getEndX() + 25, coo.getEndY() + 25, p);
173 c.drawLine(coo.getEndX() - 25, coo.getEndY() + 25, coo.getEndX() + 25, coo.getEndY() - 25, p);
174 }
175
176 for(Coordinates coo : gates) {
177 p.setColor(coo.isLocked() ? Color.parseColor("#FF9999") : Color.parseColor("#99FF99"));
178
179 c.drawRect(coo.getStartX(), coo.getStartY(), coo.getEndX(), coo.getEndY(), p);
180 }
181
182 p.setColor(Color.LTGRAY);
183
184 for(Coordinate coo : buttons) {
185 c.drawRect(coo.getX() - 50, coo.getY() - 50, coo.getX() + 50, coo.getY() + 50, p);
186 c.drawCircle(coo.getX(), coo.getY(), 50, p);
187 }
188
189 p.setColor(Color.parseColor("#FF9999"));
190 c.drawCircle(standarts.getEndX(), standarts.getEndY(), 50, p);
191 c.drawRect(standarts.getEndX() - 50, standarts.getEndY() - 50, standarts.getEndX() + 50, standarts.getEndY() + 50, p);
192
193 p.setColor(Color.parseColor("#99FF99"));
194 c.drawCircle(standarts.getStartX(), standarts.getStartY(), 50, p);
195 c.drawRect(standarts.getStartX() - 50, standarts.getStartY() - 50, standarts.getStartX() + 50, standarts.getStartY() + 50, p);
196
197 p.setColorFilter(null);
198 p.setColor(Color.CYAN);
199 c.drawCircle(cursorX, cursorY, 40, p);
200
201 //time
202
203 p.setColor(Color.WHITE);
204 p.setTextAlign(Paint.Align.LEFT);
205 c.drawText(String.valueOf(getTimeSec()).replace(".", ","), 5, 20, p);
206 }
207
208 @Override
209 public boolean onTouchEvent(MotionEvent event) {
210 int action = event.getAction();
211
212 switch(action) {
213 case MotionEvent.ACTION_DOWN:
214 if(event.getX() > cursorX - 40 && event.getX() < cursorX + 40 && event.getY() > cursorY - 40 && event.getY() < cursorY + 40) {
215 motion = true;
216 lastX = event.getX();
217 lastY = event.getY();
218 if(running == false) {
219 running = true;
220 new Handler().post(updTime);
221 }
222 } else {
223 lastX = event.getX();
224 lastY = event.getY();
225 recallCls();
226 motion = false;
227 cursorX = standarts.getStartX();
228 cursorY = standarts.getStartY();
229 resetTime();
230 }
231
232 break;
233 case MotionEvent.ACTION_MOVE:
234 Boolean is = false;
235
236 if(motion == true && event.getX() > standarts.getStartX() - 50 && event.getX() < standarts.getStartX() + 50 && event.getY() > standarts.getStartY() - 50 && event.getY() < standarts.getStartY() + 50) {
237 is = true;
238 } else if(motion == true && event.getX() > standarts.getEndX() - 50 && event.getX() < standarts.getEndX() + 50 && event.getY() > standarts.getEndY() - 50 && event.getY() < standarts.getEndY() + 50) {
239 is = true;
240 }
241 for(Coordinates coo : routes) {
242 if(motion == true && event.getX() > coo.getStartX() && event.getX() < coo.getEndX() && event.getY() > coo.getStartY() && event.getY() < coo.getEndY()) {
243 is = true;
244 }
245 }
246 for(Coordinate coo : fakeGoals) {
247 if(motion == true && event.getX() > coo.getX() - 50 && event.getX() < coo.getX() + 50 && event.getY() > coo.getY() - 50 && event.getY() < coo.getY() + 50) {
248 is = true;
249 }
250 }
251 for(Coordinates coo : porters) {
252 if(motion == true && event.getX() > coo.getStartX() - 50 && event.getX() < coo.getStartX() + 50 && event.getY() > coo.getStartY() - 50 && event.getY() < coo.getStartY() + 50) {
253 is = true;
254 }
255 }
256 for(Coordinates coo : porters) {
257 if(motion == true && event.getX() > coo.getEndX() - 25 && event.getX() < coo.getEndX() + 25 && event.getY() > coo.getEndY() - 25 && event.getY() < coo.getEndY() + 25) {
258 is = true;
259 }
260 }
261 for(Coordinate coo : buttons) {
262 if(motion == true && event.getX() > coo.getX() - 50 && event.getX() < coo.getX() + 50 && event.getY() > coo.getY() - 50 && event.getY() < coo.getY() + 50) {
263 is = true;
264 }
265 }
266 for(Coordinates coo : gates) {
267 if(motion == true && event.getX() > coo.getStartX() && event.getX() < coo.getEndX() && event.getY() > coo.getStartY() && event.getY() < coo.getEndY()) {
268 if(coo.isLocked()) {
269 is = false;
270 } else {
271 is = true;
272 }
273 }
274 }
275 for(Coordinates coo : antiRoutes) {
276 if(motion == true && event.getX() > coo.getStartX() && event.getX() < coo.getEndX() && event.getY() > coo.getStartY() && event.getY() < coo.getEndY()) {
277 is = false;
278 }
279 }
280
281 Float lastXAbs = lastX - event.getX();
282 if(lastXAbs < 0) {
283 lastXAbs *= -1;
284 }
285
286 Float lastYAbs = lastY - event.getY();
287 if(lastYAbs < 0) {
288 lastYAbs *= -1;
289 }
290
291 if(lastXAbs > 100) {
292 is = false;
293 }
294 if(lastYAbs > 100) {
295 is = false;
296 }
297
298 lastX = event.getX();
299 lastY = event.getY();
300
301 if(is) {
302 cursorX = event.getX();
303 cursorY = event.getY();
304 postInvalidate();
305 } else {
306 motion = false;
307 recallCls();
308 cursorX = standarts.getStartX();
309 cursorY = standarts.getStartY();
310 resetTime();
311 postInvalidate();
312 }
313 break;
314 case MotionEvent.ACTION_UP:
315 Boolean stay = false;
316
317 if(motion == true && event.getX() > standarts.getEndX() - 50 && event.getX() < standarts.getEndX() + 50 && event.getY() > standarts.getEndY() - 50 && event.getY() < standarts.getEndY() + 50) {
318 if(listener != null) {
319 running = false;
320
321 listener.onDone(getTimeSec());
322 }
323 stay = true;
324 }
325
326 for(Coordinate co : buttons) {
327 if(motion == true && event.getX() > co.getX() - 50 && event.getX() < co.getX() + 50 && event.getY() > co.getY() - 50 && event.getY() < co.getY() + 50) {
328 if(!co.isLocked()) {
329 for(Coordinates coo : wires) {
330 Coordinate use = new Coordinate();
331 use.setLocked(false);
332
333 if(coo.getStartX() > co.getX() - 50 && coo.getStartY() < co.getX() + 50 && coo.getStartY() > co.getY() - 50 && coo.getStartY() < co.getY() + 50) {
334 use = Coordinate.newC(coo.getEndX(), coo.getEndY());
335 use.setLocked(true);
336 } else if(coo.getEndX() > co.getX() - 50 && coo.getEndY() < co.getX() + 50 && coo.getEndY() > co.getY() - 50 && coo.getEndY() < co.getY() + 50) {
337 use = Coordinate.newC(coo.getStartX(), coo.getStartY());
338 use.setLocked(true);
339 }
340
341 if(use.isLocked()) {
342 for(Coordinates cooo : porters) {
343 if(use.getX() > cooo.getStartX() - 50 && use.getX() < cooo.getStartX() + 50 && use.getY() > cooo.getStartY() - 50 && use.getY() < cooo.getStartY() + 50) {
344 Float sx = cooo.getEndX();
345 Float sy = cooo.getEndY();
346 Float ex = cooo.getStartX();
347 Float ey = cooo.getStartY();
348 cooo.setStartX(sx);
349 cooo.setStartY(sy);
350 cooo.setEndX(ex);
351 cooo.setEndY(ey);
352 } else if(use.getX() > cooo.getEndX() - 25 && use.getX() < cooo.getEndX() + 25 && use.getY() > cooo.getEndY() - 25 && use.getY() < cooo.getEndY() + 25) {
353 Float sx = cooo.getEndX();
354 Float sy = cooo.getEndY();
355 Float ex = cooo.getStartX();
356 Float ey = cooo.getStartY();
357 cooo.setStartX(sx);
358 cooo.setStartY(sy);
359 cooo.setEndX(ex);
360 cooo.setEndY(ey);
361 }
362 }
363 for(Coordinates cooo : gates) {
364 if(use.getX() > cooo.getStartX() && use.getX() < cooo.getEndX() && use.getY() > cooo.getStartY() && use.getY() < cooo.getEndY()) {
365 cooo.setLocked(cooo.isLocked() ? false : true);
366 }
367 }
368 }
369 }
370 }
371 co.setLocked(true);
372 postInvalidate();
373 stay = true;
374 }
375 }
376
377 for(Coordinates c : porters) {
378 if(motion == true && event.getX() > c.getStartX() - 50 && event.getX() < c.getStartX() + 50 && event.getY() > c.getStartY() - 50 && event.getY() < c.getStartY() + 50) {
379 cursorX = c.getEndX();
380 cursorY = c.getEndY();
381 postInvalidate();
382 stay = true;
383 }
384 }
385
386 if(stay == false) {
387 motion = false;
388 recallCls();
389 cursorX = standarts.getStartX();
390 cursorY = standarts.getStartY();
391 resetTime();
392 postInvalidate();
393 }
394
395 break;
396 }
397
398 return true;
399 }
400
401 public void resetTime() {
402 running = false;
403 milli = 0.0f;
404 time = 0.0f;
405 }
406
407 public Runnable updTime = new Runnable() {
408 public void run() {
409 if(running) {
410 milli = milli + 100;
411
412 new Handler().postDelayed(updTime, 100);
413 }
414 }
415 };
416
417 public interface OnActionListener {
418 public void onDone(float time);
419 }
420
421}

Antworten
Christian
  • Forum-Beiträge: 307

04.07.2013, 12:23:12 via Website

Hi Aaron B.

schau dir mal das Beispiel hier an:
1ArrayList<String> data = new ArrayList<String>();
2
3data.add("Eddard");
4data.add("Catelyn");
5data.add("Robb");
6data.add("Sansa");
7data.add("Arya");
8
9ArrayList<String>tmp = (ArrayList<String>)data.clone();
10
11System.out.println("**************** Ausgabe: DATA ******************");
12
13for(String t : data){
14 System.out.println(t);
15}
16
17System.out.println("******************** Ausagabe: TMP **************");
18for(String t : tmp){
19 System.out.println(t);
20}
21
22System.out.println("**************** Ausgabe: DATA Strings hinzugefügt ***************");
23
24data.add("Bran");
25data.add("Rickon");
26data.add("Jon");
27
28for(String t : data){
29 System.out.println(t);
30}
31
32System.out.println("******************** Ausgabe: TMP **************");
33for(String t : tmp){
34 System.out.println(t);
35}
36
37System.out.println("**************** Inhalt von DATA gelöscht ******************");
38
39data.clear();
40
41for(String t : data){
42 System.out.println(t);
43}
44
45System.out.println("******************Ausgabe: TMP ****************");
46for(String t : tmp){
47 System.out.println(t);
48}

Ausgab:
1**************** Ausgabe: DATA ******************
2Eddard
3Catelyn
4Robb
5Sansa
6Arya
7******************** Ausagabe: TMP **************
8Eddard
9Catelyn
10Robb
11Sansa
12Arya
13**************** Ausgabe: DATA Strings hinzugefügt ******************
14Eddard
15Catelyn
16Robb
17Sansa
18Arya
19Bran
20Rickon
21Jon
22******************** Ausgabe: TMP **************
23Eddard
24Catelyn
25Robb
26Sansa
27Arya
28**************** Inhalt von DATA gelöscht ******************
29******************Ausgabe: TMP ****************
30Eddard
31Catelyn
32Robb
33Sansa
34Arya

Mfg Christian

Antworten
Aaron B.
  • Forum-Beiträge: 206

04.07.2013, 14:17:23 via App

Ok also ich habe jetzt das Problem behoben:

Im MotionEvent editiere ich gates:

1for(Coordinates cooo : gates) {
2 if(use.getX() > cooo.getStartX() && use.getX() < cooo.getEndX() && use.getY() > cooo.getStartY() && use.getY() < cooo.getEndY()) {
3 cooo.setLocked(cooo.isLocked() ? false : true);
4 }
5 }

Weil die Items aus clgates geklont sind, sind sie die gleichen Items wie die aus gates. Sie sind also sozusagen verlinkt. Um das zu verhindern, muss man beim Erstellen des Klones einfach folgendes tun:

1for(Coordinates c : gates) {
2 Coordinates res = Coordinates.newC(c.getStartX(), c.getStartY(), c.getEndX(), c.getEndY());
3 res.setLocked(c.isLocked());
4 clgates.add(res);
5 }

So wird eine neue Koordinate erstellt und die Listen sind nicht mehr verlinkt.

LG Aaron B.

Danke für die Unterstützung :)

PS:
Die static void
1Coordinates.newC(float sx, float sy, float ex, float ey);
erstellt ein neues Koordinaten-Bündel aus den Angaben.

Antworten