zweidimensionales Array

  • Antworten:15
Erich Floh
  • Forum-Beiträge: 12

17.05.2012, 13:50:46 via Website

Ich bin grundsätzlich neuling in dieser Programmierung.
Ich habe ein APP zusammengestellt nun möchte ich darin daten von einem Webserver den ich ebenfalls selbst entwickelt habe abrufen und eine XML gestallten wo ich die daten individuell zur anzeige bringen kann.
die daten kommen so
tempa, 12.7;tempamin, 4.1;tempamax, 31.3;feuchtea,46;taupa, 1.4;taupamin, -0.7;taupamax, 17.8;windgesch, 11.7;windgeschmax, 43.4;windrichtung,;windrichgrad,0;niedersch,;regentrocken,;absdruck, 781.24;reldruck, 804.99;wettervorschau,WOLKEN+REGEN;reldruckmin, 802.61;reldruckmax,1030.56;tempi, ERR ;tempimin, 21.0;tempimax, 21.0;feuchtei,0;besucher,101;minmaxdatum,Son 6.05.2012 12:10:54;statik, 46.558;statikmin, 46.509;statikmax, 46.606;maxad0,1907;maxad1,1884;maxad2,1872;maxad3,1880;maxad4,1874;maxad5,1875;maxad6,1872;maxad7,1878;gasv, 0.0;
zur zeit bin ich soweit das ich die daten in einem Message habe.
nur wie geht es weiter?
bitte hier um Antort für einen Anfänger
(Google habe ich schon verwendet)
Danke
1package home.control.namespace;
2import android.app.Activity;
3import android.os.Bundle;
4// used for interacting with user interface
5import android.widget.Button;
6import android.widget.TextView;
7import android.widget.EditText;
8import android.text.TextUtils;
9import android.view.View;
10// used for passing data
11import android.os.Handler;
12import android.os.Message;
13// used for connectivity
14import java.io.BufferedReader;
15import java.io.InputStreamReader;
16import java.net.URL;
17import java.net.URLConnection;
18import java.util.*;
19import java.util.*;
20
21 public class HeizungActivity extends Activity {
22 /** Called when the activity is first created. */
23
24 Handler h;
25
26
27 @Override
28 public void onCreate(Bundle savedInstanceState) {
29 super.onCreate(savedInstanceState);
30 setContentView(R.layout.heizung);
31
32 final EditText eText = (EditText) findViewById(R.id.address);
33 final TextView tView = (TextView) findViewById(R.id.pagetext);
34
35
36 this.h = new Handler() {
37
38 @Override
39 public void handleMessage(Message msg) {
40 // process incoming messages here
41 switch (msg.what) {
42 case 0:
43 tView.append((String) msg.obj);
44 break;
45 }
46 super.handleMessage(msg);
47 }
48 };
49 final Button button = (Button) findViewById(R.id.ButtonGo);
50 button.setOnClickListener(new Button.OnClickListener() {
51 public void onClick(View v) {
52 try {
53 tView.setText("");
54 // Perform action on click
55 URL url = new URL(eText.getText().toString());
56 URLConnection conn = url.openConnection();
57 // Get the response
58 BufferedReader rd = new BufferedReader(new
59 InputStreamReader(conn.getInputStream()));
60 String line = "";
61 while ((line = rd.readLine()) != null) {
62 Message lmsg;
63
64
65 lmsg = new Message();
66 lmsg.obj = line;
67
68 lmsg.what = 0;
69
70 HeizungActivity.this.h.sendMessage(lmsg);
71
72
73 }
74
75
76 }
77 catch (Exception e) {
78
79
80 }
81 }
82 });
83
84 }
85
86 }

Antworten
Fabian W.
  • Forum-Beiträge: 17

17.05.2012, 16:58:58 via Website

kommt drauf an was du mit den daten weiter anfangen willst, in ListView schreiben,...

— geändert am 17.05.2012, 17:03:06

Antworten
Aeefire
  • Forum-Beiträge: 172

17.05.2012, 17:29:22 via Website

achja und ich würd dir empfehlen die Daten innerhalb eines "ASyncTasks" vom Server zu holen... denn wenn das ganze (aufgrund schlechter Verbindung, hoher Datenmenge etc.pp.) länger als 3 (oder warens 5?) sekunden dauert, gibt's nen "ANR" (Application Not Responding) Error und deine Activity ist schnell geschichte :)

Antworten
Erich Floh
  • Forum-Beiträge: 12

17.05.2012, 17:56:50 via Website

ok Danke
Nur leider Hilft mir das nicht viel da ich Anfänger bin
ich möchte nur eine xml machen und die Einzellnen Daten auf einer seite zur anzeige bringen
zb
Aussentemperatur: eingelesener Wert(ATEMP) °C
.
.
.

Antworten
Erich Floh
  • Forum-Beiträge: 12

18.05.2012, 14:45:16 via Website

Danke das werde ich mal testen.
Ich hoffe das ich alles verstehe, ansosten melde ich mich nochmals hier.

danke.

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

18.05.2012, 15:02:04 via Website

Hey,

oder ist dein Problem, dass du nicht verstehst, wie du die ausgelesenen Daten zwischenspeichern sollst?
Ich denke, anstelle eines zweidimensionalen Array könnte man eine eigene WrapperKlasse mit einer ArrayList nutzen. Oder einfach eine (Hash-) Map. Hier ein Beispiel dazu: http://www.java-samples.com/showtutorial.php?tutorialid=369

Lg Ansgar

Antworten
Erich Floh
  • Forum-Beiträge: 12

18.05.2012, 15:16:13 via Website

hallo
mein Grundsätzliches problem ist das ich nicht weis wie man das in java richtig löst, ich komme aus anderen Programmierumgebungen.
ich möchte zur ausgabe eine Smartphone Seite mit einer Übersichtlichen Auflistung erstellen.
der datenstrom kommt immer im format "name, wert;" der ";" is das trennzeichen.
in PHP lese ich den stream in einem zwei Dimensionalen Array ein und kann ihn mit Arrayname[name] zur anzeige bringen.
hier funktioniert es etwas anders ist mir klar. nur nicht genau wie.
vielleicht kannst du mir einen Hinweis geben welche variante hier am besten wäre.
Danke.

Antworten
Fabian W.
  • Forum-Beiträge: 17

19.05.2012, 03:11:38 via Website

alo so ganz weiß ich noch nicht wie du deine daten bekommst??
Parst du die Daten?? oder kommen die von einer Datei?

Antworten
Erich Floh
  • Forum-Beiträge: 12

19.05.2012, 12:48:44 via Website

Hi
Ich bekomme die daten so von einem externen Server über Internet.
1try {
2
3 tView.setText("");
4
5 URL url = new URL(text);
6 URLConnection conn = url.openConnection();
7 // Get the response
8 BufferedReader rd = new BufferedReader(new
9 InputStreamReader(conn.getInputStream()));
10 String line = "";
11 while ((line = rd.readLine()) != null) {
12 Message lmsg;
13
14
15 lmsg = new Message();
16 lmsg.obj = line;
17 lmsg.what = 0;
18
19
20 // HashMap<String, String> meMap=new HashMap<String, String>();
21
22
23
24 WetterstationActivity.this.h.sendMessage(lmsg);
Wie kann ich dies nun Automatisch in eine Hashmap schreiben und danach am Display ausgeben?
Danke

Antworten
Fabian W.
  • Forum-Beiträge: 17

20.05.2012, 15:27:50 via Website

also: ganz am anfang musst du eine ArrayList anlegen, die du dem Adapter später übergeben kannst!

ArrayList<HashMap<String, String>> DatenList = new ArrayList<HashMap<String, String>>();

Wie man sieht, packst du in die ArrayList immer eine HashMap mit 2 Strings!!


Als nächstes musst du in deiner while - Schleife eine Hashmap anlegen:
HashMap<String, String> map = new HashMap<String, String>();

dann packst du in der while - Schleife deine Daten in die Map:
map.put("datenname", daten);
hierbei ist daten die variable in der deine daten stehn und datenname eine bezeichnung unter der die die daten speicherst..

zu guter letzt in der while - schleife, packst du die map in die ArrayList:
DatentList.add(map);


außerhalb der while - Schleife übergibst du dann dem Adapter die ArrayList:
ListAdapter adapter = new SimpleAdapter(this, DatenList, R.dein_layout, new String[] { "datenname" }, new int[] { R.id.dein_textview });
setListAdapter(adapter);

Antworten
Erich Floh
  • Forum-Beiträge: 12

20.05.2012, 20:55:34 via Website

Danke
ich habe das nun soweit implementiert,
Ich kann jedoch noch nicht heraussehen wie die Daten gespittet werden.
ich have in der zwischenzeit versuche gemacht, das hat schon mal funktioniert
verschiedene Server(von denen die Daten kommen) haben jedoch eventuell eine andere reihenfolge.
somit ist meine variante nicht gut, da dann die Daten falsch angezeigt werden.
Diesen code habe ich nun mit // ausgeklammert damit du sehen kannst was ich jemacht habe.

Wie gesagt im endstadion möchte ich nur die Daten auf einer seite Ausgeben lassen
ca. so
myText.setText("Temperatur Aussen:" map.get("tempa") "°C\n"
ich denke o ungefähr müsste das gehen
Für: Temperatur Ausssen: 24,2°C nächste zeile

1try {
2
3 tView.setText("");
4 ArrayList<HashMap<String, String>> DatenList = new ArrayList<HashMap<String, String>>();
5 URL url = new URL(text);
6 URLConnection conn = url.openConnection();
7 // Get the response
8 BufferedReader rd = new BufferedReader(new
9 InputStreamReader(conn.getInputStream()));
10 String line = "";
11 while ((line = rd.readLine()) != null) {
12 HashMap<String, String> map = new HashMap<String, String>();
13 map.put("datenname", daten);
14 DatentList.add(map);
15
16 lmsg = new Message();
17 lmsg.obj = line;
18 lmsg.what = 0;
19
20 stream += line;
21
22 // HashMap<String, String> meMap=new HashMap<String, String>();
23 // meMap.put("Test", "value");
24 // RelativeLayout lView = new RelativeLayout(this);
25
26 // myText = new TextView(this);
27 // myText.setText("E&A Systems LTD");
28
29 // lView.addView(myText);
30
31 // setContentView(lView);
32
33 }
34
35 }
36 catch (Exception e) {
37 // WetterstationActivity.this.h.sendMessage(lmsg);
38 // String [] sstream = stream.split( ";|,");
39
40 ListAdapter adapter = new SimpleAdapter(this, DatenList, R.layout.wetterstation, new String[] { "datenname" }, new int[] { R.id.pagetext });
41 setListAdapter(adapter);
42
43
44 // myText = (TextView) findViewById(R.id.pagetext);
45 // myText.setTextColor(getResources().getColor(R.color.red));
46 // Set keys = meMap.keySet();
47 // text="Temperatur Aussen: " +sstream[1] +" °C \nFeuchte: " +sstream[7]+ " %";
48 // myText.setText(text);
49
50 }
51 }
52 });
53
54 }


Ich sehe das es nicht ganz stimmern kann.
es ist mir nicht klar wie die daten gesplittet werden.
oder soll ich das in der form machen wie ich es ausgeklammert habe.
könntest du mir bitte im bestehenden text die notwendigen vermerke oder code eintragen.
Danke

Antworten
Erich Floh
  • Forum-Beiträge: 12

21.05.2012, 16:34:14 via Website

Hallo
Ich habe es nun mal so gelöst.
Die Daten kommen raus.
Nur wenn ich die Daten ein zweites mal über Internet abrufen habe ich sie in der Liste zwei mal hintereinander stehen.
wie kann ich diese Löschen?
Das war die Erste Frage:
Die zweite frage ist
i habe im Hashmap zb. "tempa","24,5"
nun möchte ich im Hashmap "tempa" auf "Temperatur Aussen" ändern

wie kann ich die beiden angelegenheiten berichtigen?

Danke
Dies ist mein Derzeitiger Code


[code]
try {

tView.setText("");

URL url = new URL(text);
URLConnection conn = url.openConnection();
// Get the response
BufferedReader rd = new BufferedReader(new
InputStreamReader(conn.getInputStream()));
String line = "";
while ((line = rd.readLine()) != null) {


lmsg = new Message();
lmsg.obj = line;
lmsg.what = 0;

stream += line;

// HashMap<String, String> meMap=new HashMap<String, String>();
// meMap.put("Test", "value");
// RelativeLayout lView = new RelativeLayout(this);

// myText = new TextView(this);
// myText.setText("E&A Systems LTD");

// lView.addView(myText);

// setContentView(lView);

}
}


catch (Exception e) {
// WetterstationActivity.this.h.sendMessage(lmsg);
String [] sstream=null;
sstream = stream.split( ";|,");
stream="";
// myText = (TextView) findViewById(R.id.pagetext);
// myText.setTextColor(getResources().getColor(R.color.red));
for (int i=0; i<sstream.length; i++)
{
HashMap<String, String> map = new HashMap<String, String>();
map.put("Datenname", sstream[i]);
//map.put("Value", sstream[i+1]);
DatenList.add(map);
// Food tempamin = DatenList.get( "Temperatur Aussen min" );
// tempamin.setColour( "brown" );

}




ListAdapter adapter = new SimpleAdapter(context,DatenList, android.R.layout.simple_list_item_2, values, new int[] { android.R.id.text1});
// ArrayAdapter<String> adapter = new ArrayAdapter<String>(context,android.R.layout.simple_list_item_1, android.R.id.text1, values);

gv.setAdapter(adapter);
gv.setAdapter(adapter1);

// myText = (TextView) findViewById(R.id.pagetext);
// myText.setTextColor(getResources().getColor(R.color.red));
// Set keys = meMap.keySet();
// text="Temperatur Aussen: " +sstream[1] +" °C \nFeuchte: " +sstream[7]+ " %";
// myText.setText(text);

}
}
});

}

}
[/code]

— geändert am 21.05.2012, 16:35:05

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

21.05.2012, 18:47:10 via App

Hey,

nur als Tipp: Entferne doch die auskommentierten Zeilen, wenn du hier Code postest.

Lg Ansgar

Antworten
Fabian W.
  • Forum-Beiträge: 17

22.05.2012, 19:42:31 via Website

was ist denn "gv.setAdapter(adapter1);" ???

du wilslt die seite aktualiseren? einfach die aktivity neu starten..

startActivity(getIntent()); finish();

das ganze vielleicht noch in ein kleines aufklappmenü an den unteren rand des displays

1//--------------Aufklappmenu unten-------------------
2 public boolean onOptionsItemSelected(MenuItem item) {
3
4 switch (item.getItemId()) {
5 case R.id.opt_akt:
6 startActivity(getIntent()); finish();
7 return true;
8 default:
9 return super.onOptionsItemSelected(item);
10 }
11 }
12
13 public boolean onCreateOptionsMenu(Menu menu)
14 {
15 getMenuInflater().inflate(R.menu.pinnwandmenu, menu);
16 return super.onCreateOptionsMenu(menu);
17 }
18 //---------------------------------------------------


Zu der 2.Frage:

"tempa","24,5" ist ein String, den musst du beim , (Komma trennen), zb so;

String[] separated = CurrentString.split(",");
separated[0]; // hier steht dann tempa
separated[1]; und hier 24,5

wenn du das jetzt für jedes wertepaar machst, kannst du jeweils separated[0] durch ein element einen String - Arrays erstzen, indem dann eben Außentemeratur, Innentemperatur,.... steht.

Danach nimmst du seperated[0], indem jetzt zb Außentemperaur steht und seperated[1] pachst beides zusammen, und gibst es der HashMap!

String text = seperated[0] + ": " + seperated[1];

— geändert am 22.05.2012, 23:34:29

Antworten
Fabian W.
  • Forum-Beiträge: 17

22.05.2012, 23:35:03 via Website

Kleine Ergänzung zu meiner letzten Antwort...

Antworten