T
Tom299
Stamm-User
- 122
Hallo Leute,
nach ca. 2 Jahren Pause bin ich wieder bei Android gelandet. Ich hab gerade ein triviales Programm, was aber nicht so will, wie ich das möchte. Hab sogar Code aus meinen alten Programmen zum Vergleich genommen. Dort hat es damals so funktioniert, und jetzt irgendwie im neuen Code nicht mehr.
Folgendes Problem:
Ich initialisiere meinen eigenen ArrayAdapter und setze ihn an die ListView. Anfangs ist die Liste natürlich leer. Dann drück ich den Button zum Aktualisieren, es wird eine XML-Datei aus dem Inet gelesen und die Liste wird dadurch gefüllt. Leider wird die ListView aber nicht aktualisiert, und ich weiß nicht, woran es hängt. statusAdapter.notifyDataSetChanged() sollte eigentlich reichen, mehr stand damals im alten Code an dieser Stelle auch nicht und es hat funktioniert ...
Nur wenn ich den Adapter nochmal neu nach dem Lesen initialisiere und wieder neu an die ListView hänge, passiert etwas. Aber das kanns doch nicht sein, ging doch im alten Code auch. Fehlt mir irgendein Setting?
Das nächste Problem hängt gleich damit zusammen:
Mein ArrayAdapter wird im 1. Durchlauf (1. Row) initialisiert und die 3 TextViews sind vorhanden. Beim 2. Durchlauf, wo die View nur noch gecastet wird, weil ja schon vorhanden, sind die TextView aber NULL bzw. es knallt beim Cast der 1. TextView. Auch hier weiß ich im Moment keinen Rat :-(
Hier meine Listings:
MainActivity:
Mein ArrayAdapter:
Manifest:
nach ca. 2 Jahren Pause bin ich wieder bei Android gelandet. Ich hab gerade ein triviales Programm, was aber nicht so will, wie ich das möchte. Hab sogar Code aus meinen alten Programmen zum Vergleich genommen. Dort hat es damals so funktioniert, und jetzt irgendwie im neuen Code nicht mehr.
Folgendes Problem:
Ich initialisiere meinen eigenen ArrayAdapter und setze ihn an die ListView. Anfangs ist die Liste natürlich leer. Dann drück ich den Button zum Aktualisieren, es wird eine XML-Datei aus dem Inet gelesen und die Liste wird dadurch gefüllt. Leider wird die ListView aber nicht aktualisiert, und ich weiß nicht, woran es hängt. statusAdapter.notifyDataSetChanged() sollte eigentlich reichen, mehr stand damals im alten Code an dieser Stelle auch nicht und es hat funktioniert ...
Nur wenn ich den Adapter nochmal neu nach dem Lesen initialisiere und wieder neu an die ListView hänge, passiert etwas. Aber das kanns doch nicht sein, ging doch im alten Code auch. Fehlt mir irgendein Setting?
Das nächste Problem hängt gleich damit zusammen:
Mein ArrayAdapter wird im 1. Durchlauf (1. Row) initialisiert und die 3 TextViews sind vorhanden. Beim 2. Durchlauf, wo die View nur noch gecastet wird, weil ja schon vorhanden, sind die TextView aber NULL bzw. es knallt beim Cast der 1. TextView. Auch hier weiß ich im Moment keinen Rat :-(
Hier meine Listings:
MainActivity:
Code:
package de.test.activity;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import de.ianeo.servermonitor.R;
import de.ianeo.servermonitor.adapter.StatusArrayAdapter;
import de.ianeo.servermonitor.model.ServerCheck;
import de.ianeo.servermonitor.tools.XMLReader;
public class MainActivity extends Activity {
private ArrayList<ServerCheck> serverChecks = new ArrayList<ServerCheck>(0);
private StatusArrayAdapter statusAdapter;
private Button btnRefresh;
private ListView listViewStatus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout mainLayout = (LinearLayout)findViewById(R.id.activity_main_linear_layout);
listViewStatus = new ListView(this);
listViewStatus.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
// ServerCheck sc = new ServerCheck();
// sc.setCustomer("Test1");
// sc.setChecktype("HTML");
// sc.setInfo("OK");
// serverChecks.add(sc);
// sc = new ServerCheck();
// sc.setCustomer("Test2");
// sc.setChecktype("ASPX");
// sc.setInfo("ERROR");
// serverChecks.add(sc);
statusAdapter = new StatusArrayAdapter(this, R.layout.table_server_status, serverChecks);
listViewStatus.setAdapter(statusAdapter);
listViewStatus.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> av, View v, int index, long arg) {
ServerCheck serverCheck = serverChecks.get(index);
if (serverCheck.isExpanded()) {
// zuklappen
serverCheck.setExpanded(false);
}
else {
// aufklappen
serverCheck.setExpanded(true);
}
statusAdapter.notifyDataSetChanged();
}
});
mainLayout.addView(listViewStatus);
btnRefresh = (Button)mainLayout.findViewById(R.id.main_btnRefresh);
btnRefresh.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
updateServerStatus();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private void updateServerStatus() {
Thread thStatusUpdate = new Thread( new Runnable() {
@Override
public void run() {
final XMLReader xmlReader = new XMLReader("http://test.de/status.php");
runOnUiThread(new Runnable() {
@Override
public void run() {
serverChecks = xmlReader.getServerChecks();
statusAdapter.notifyDataSetChanged();
//statusAdapter = new StatusArrayAdapter(MainActivity.this, R.layout.table_server_status, serverChecks);
//listViewStatus.setAdapter(statusAdapter);
}
});
}
});
thStatusUpdate.start();
}
}
Mein ArrayAdapter:
Code:
package de.test.adapter;
import java.util.List;
import de.ianeo.servermonitor.R;
import de.ianeo.servermonitor.model.ServerCheck;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TableLayout;
import android.widget.TextView;
public class StatusArrayAdapter extends ArrayAdapter<ServerCheck> {
private int resource;
private TableLayout statusView;
public StatusArrayAdapter(Context context, int resourceId, List<ServerCheck> items) {
super(context, resourceId, items);
this.resource = resourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ServerCheck serverCheck = getItem(position);
if (statusView == null) {
statusView = new TableLayout(getContext());
LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(resource, statusView, true);
}
else {
statusView = (TableLayout)convertView;
}
TextView tvCustomer = (TextView)statusView.findViewById(R.id.tv_table_server_status_customer);
TextView tvCheckType = (TextView)statusView.findViewById(R.id.tv_table_server_status_checktype);
TextView tvInfo = (TextView)statusView.findViewById(R.id.tv_table_server_status_info);
if (serverCheck.getCustomer() != null) {
tvCustomer.setText(serverCheck.getCustomer());
}
if (serverCheck.getChecktype() != null) {
tvCheckType.setText(serverCheck.getChecktype());
}
if (serverCheck.getInfo() != null) {
tvInfo.setText(serverCheck.getInfo());
}
return statusView;
}
}
Manifest:
Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.test"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="de.ianeo.servermonitor.activity.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>