Zeilen in der xml meiner App werden nicht alle angezeigt

  • 8 Antworten
  • Neuester Beitrag
Diskutiere Zeilen in der xml meiner App werden nicht alle angezeigt im Android App Entwicklung im Bereich Betriebssysteme & Apps.
M

Michael68

Neues Mitglied
Hallo zusammen,

ich bin Anfänger in der App programmierung und habe mir da mal 2 Tutorials zusammen gewürfelt
Ich habe nur noch ein klitze kleines Problemchen.
Es geht darum .....
ich möchte von meiner Datenbank aus dem Internet eine Liste mit den Daten in zwei Spalten augegeben bekommen.
In der Zeit wo die Daten laden soll ein ProgressDialog laufen.
Das einzige Problem ist im Moment das das nachfolgende Script mir nur den letzten Datensatz anzeigt, obwohl es zur Zeit vier sein sollten.
Könnte mir einer etwas helfen ?


Gruß Michael
PHP:
  package de.htmlinside;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.app.ActionBar.LayoutParams;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

    public class Anfrage extends Activity implements Runnable{
        ProgressDialog progress;
        String result=null;

        InputStream is;
        JSONObject json_data;
        TableLayout table;
        TextView columnOneText;
        TextView columnTwoText;
        String columnOneString;
        String columnTwoString;


@Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.anfrage);



            initThread();

        }

        public void initThread() {
            progress = new ProgressDialog(Anfrage.this);

            progress.setTitle("Bitte Gedult");
            progress.setMessage("Daten werden geladen...");
            progress.show();
            Thread thread = new Thread(this);
            thread.start();
        }

@Override
    public void run() {
            initView();
            handler.sendEmptyMessage(0);
            }

@SuppressLint("HandlerLeak")
private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg){

        progress.dismiss();
        fillList();


    }
};
private void initView() {
    result = doRequest();

}

private String doRequest() {
    String result = "";
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

    try {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://www.XXXX.de/XXX.php");
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity entity = response.getEntity();
    is = entity.getContent();
    }catch(Exception e){
    Log.e("log_tag", "Fehler bei der http Verbindung "+e.toString());
    }

    try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
    sb.append(line + "n");
    }
    is.close();
    result=sb.toString();
    }catch(Exception e){
    Log.e("log_tag", "Error converting result "+e.toString());
    }

    try {
    JSONArray jArray = new JSONArray(result);
    for(int i=0;i<jArray.length();i++){
    json_data = jArray.getJSONObject(i);
    columnOneString = json_data.getString("userid").toString();
    columnTwoString = json_data.getString("login").toString();
//    fillList();

    }
    }catch(JSONException e){
    Log.e("log_tag", "Error parsing data "+e.toString());
    }

    return result;
}

// Array 'cListArray' wird in die listView geschrieben
@SuppressLint("InlinedApi") public void fillList() {

    table = (TableLayout) findViewById(R.id.TableLayout01);
    TableRow row = new TableRow(this);
    columnOneText = new TextView(this);
    columnTwoText = new TextView(this);
    columnOneText.setText(columnOneString);
    columnTwoText.setText(columnTwoString);
    row.addView(columnOneText);
    row.addView(columnTwoText);

 table.addView(row,new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    }
}
die xml ist
PHP:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">

<ScrollView
        android:id="@+id/ScrollView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    <TableLayout
        android:id="@+id/TableLayout01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:stretchColumns="0">

         <TableRow
             android:id="@+id/TableRow01"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content">

             <TextView
             android:id="@+id/TextView01"
             android:layout_width="150dp"
             android:layout_height="150dp"
             android:text="UserID"/>

             <TextView
             android:id="@+id/TextView02"
             android:layout_width="150dp"
             android:layout_height="150dp"
             android:text="Name"/>

             </TableRow>
        </TableLayout>
    </ScrollView>
</LinearLayout>
 
markus.tullius

markus.tullius

Experte
Hallo Michael,

das liegt an deine for-Schleife in doRequest(). Du befüllst die zwei Felder columnOneString und columnTwoString immer wieder. Dabei überschreibst du die alten Werte. Am Schluss dort steht dort nur der Werte des letzten Schleifendurchlauf. Und die schreibt du in deine Liste.

Noch ein Bemerkung zu deinen Code. Die Activity als Runnable zu benutzen, ist nicht so klug, schon wegen den Lifecycle der Activity. Das kann zu Fehlern in der Speicherverwaltung führen. Besser wäre eine eigene Klasse für den Runnable. Am besten du schaust Dir noch mal das Beispiel von Google an:

Processes and Threads | Android Developers

Die Klasse HttpCleint wird seit Android 2.2 nicht mehr gepflegt, und ist eigentlich decrepated. Stattdessen sollte man die Klasse HttpUrlConnection benutzten.
 
A

amfa

Experte
Und das fillList() was du auskommentiert hast ist dort eigentlich richtig,
theoretisch würdest du dann immer den aktullen String aus ColumnOneString und columnTwoString dort reinschreiben.

Aber vermutlich hast du das auskommentiert, weil das einen Fehler gegeben hat (Exception in bezug auf Veränderungen am layout aus einem anderen Thread als dem UI thread.)

Entweder machst du da ein runOnUIThread() drumrum oder aber du überspringst die initView Methode und tust das hier alles:
Code:
    try {
    JSONArray jArray = new JSONArray(result);
    for(int i=0;i<jArray.length();i++){
    json_data = jArray.getJSONObject(i);
    columnOneString = json_data.getString("userid").toString();
    columnTwoString = json_data.getString("login").toString();
//    fillList();

    }
    }catch(JSONException e){
    Log.e("log_tag", "Error parsing data "+e.toString());
    }
In der handleMessage Methode abarbeiten.
so müsste deine run Methode dann aussehen:
Code:
    public void run() {
            String result = doRequest();
            Message msg = Handler.obtainMessage (0, 0, 0, result)
            handler.sendMessage(msg);
            }
In handleMessage machst du dann folgendes:
Code:
    public void handleMessage(Message msg){
    try {
        JSONArray jArray = new JSONArray(result);
        for(int i=0;i<jArray.length();i++){
        json_data = jArray.getJSONObject(i);
        columnOneString = json_data.getString("userid").toString();
        columnTwoString = json_data.getString("login").toString();
        fillList();
        }
    }catch(JSONException e){
        Log.e("log_tag", "Error parsing data "+e.toString());
    }
        progress.dismiss();
    }
Das ist alles ingesamt noch nicht richtig schön sollte aber funktionieren.
Ansonsten hör auf markus.tullius ;)
 
M

Michael68

Neues Mitglied
Danke euch beiden, ich benötige nur noch Zeit das alles zu verstehen :unsure:,
denn ohne Progress hat es so funktioniert

PHP:
package de.htmlinside;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.util.Log;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class name extends Activity{
    ProgressDialog progress;

    InputStream is;
    JSONObject json_data;
    TableLayout table;
    TextView columnOneText;
    TextView columnTwoText;
    String columnOneString;
    String columnTwoString;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.name);

//    initThread();

getData();
    }

    public void getData() {
    String result = "";
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

    try {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://www.XXXXX.de/XXXXX.php");
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity entity = response.getEntity();
    is = entity.getContent();
    }catch(Exception e){
    Log.e("log_tag", "Fehler bei der http Verbindung "+e.toString());
    }

    try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
    sb.append(line + "n");
    }
    is.close();
    result=sb.toString();
    }catch(Exception e){
    Log.e("log_tag", "Error converting result "+e.toString());
    }

    try {
    JSONArray jArray = new JSONArray(result);
    for(int i=0;i<jArray.length();i++){
    json_data = jArray.getJSONObject(i);
    columnOneString = json_data.getString("userid").toString();
    columnTwoString = json_data.getString("login").toString();
    
    fillList();
    }
    }catch(JSONException e){
    Log.e("log_tag", "Error parsing data "+e.toString());
    }
    }

@SuppressLint("InlinedApi") public void fillList() {

    table = (TableLayout) findViewById(R.id.TableLayout01);
    TableRow row = new TableRow(this);
    columnOneText = new TextView(this);
    columnTwoText = new TextView(this);
    columnOneText.setText(columnOneString);
    columnTwoText.setText(columnTwoString);
    row.addView(columnOneText);
    row.addView(columnTwoText);

 table.addView(row,new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    }
}
 
M

Michael68

Neues Mitglied
Hallo zusammen,
nach langem hin und her Bücher und Google lesen habe ich es jetzt endlich geschafft den Client weg zu bekommen. :thumbsup: :rolleyes2:
Würdet ihr das jetzt so stehen lassen oder etwas an dem Script ändern um es sicherer oder übersichtlicher zu machen?
PHP:
package de.htmlinside;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;


public class Testprogrammzwei extends Activity implements Runnable{
    ProgressDialog progress;
    String result=null;

    InputStream is;
    JSONObject json_data;
    TableLayout table;

    TextView columnOneText;
    TextView columnTwoText;
    TextView columnThreeText;
    
    String columnOneString;
    String columnTwoString;
    String columnThreeString;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.testprogrammzwei);

    initThread();
    }

    public void initThread() {
        progress = new ProgressDialog(Testprogrammzwei.this);
//        progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//        progress.setProgress(10);
        progress.setTitle("Daten");
        progress.setMessage("werden geladen...");
        progress.show();
        Thread thread = new Thread(this);
        thread.start();
    }
    
    @Override
    public void run() {
        initView();
        handler.sendEmptyMessage(0);
    }

private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg){
            try {
                JSONArray jArray = new JSONArray(result);
                for(int i=0;i<jArray.length();i++){
                json_data = jArray.getJSONObject(i);
                columnOneString = json_data.getString("userid").toString();
                columnTwoString = json_data.getString("login").toString();
                columnThreeString = json_data.getString("Email").toString();
                fillList();
                }
            }catch(JSONException e){
                Log.e("log_tag", "Error parsing data "+e.toString());
            }
                progress.dismiss();
            }
    };
    
    private void initView() {
        result = doRequest();
    }
    
     private String doRequest(Void... params) {

            String strUrl = "http://www.XXXXX.de/appentwicklung/ersteapp/app.php";                
            URL url = null;
            StringBuffer sb = new StringBuffer();
            try {
                url = new URL(strUrl);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.connect();
                InputStream iStream = connection.getInputStream();                
                BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));            
                String line = "";                
                while( (line = reader.readLine()) != null){
                    sb.append(line);
                }

                reader.close();
                iStream.close();                            

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }        
            return sb.toString();
        }        
        
@SuppressLint("InlinedApi") public void fillList() {

    table = (TableLayout) findViewById(R.id.TableLayout01);
    TableRow row = new TableRow(this);
    columnOneText = new TextView(this);
    columnTwoText = new TextView(this);
    columnThreeText = new TextView(this);
    columnOneText.setText(columnOneString);
    columnTwoText.setText(columnTwoString);
    columnThreeText.setText(columnThreeString);
    row.addView(columnOneText);
    row.addView(columnTwoText);
    row.addView(columnThreeText);

 table.addView(row,new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    }
}
 
A

amfa

Experte
Man könnte noch das auslesen des Json String im Thread machen und das Ergebnis in einem eigenen Objekt mit basic datentypen zwischenspeichern.

Ich weiß nicht wie perfomant die getString() methode des Json Objects ist.
Aber nehmen wir an, du hättest richtig viele Daten in deinen "jArray" dann könnte sich die App aufhängen weil sie in der For-Schleife "hängt" während du neue Table Rows hinzufügst.

Ich würde auch das
table = (TableLayout) findViewById(R.id.TableLayout01);

nicht jedes mal bei fillList machen ich würde die Zeile einfach "setContentView" aufrufen, die Table ändert sich ja nie und ist immer die gleiche.
Das dauert zwar nicht allzulange, aber theoretisch suchst du jedes mal die Tabelle neu obwohl du sie ja schon kennst.
Dauert wie gesagt nicht lange, aber es dauert und verlangsamt im Zweifel die App unnötig.

Und du hast immer noch alles in der Activity, schöner und besser wäre es, wenn du eine eigene Runable Klasse baust, in der dann die Onlineverbindung stattfindet.
 
M

Michael68

Neues Mitglied
amfa schrieb:
Und du hast immer noch alles in der Activity, schöner und besser wäre es, wenn du eine eigene Runable Klasse baust, in der dann die Onlineverbindung stattfindet.
Danke für die zusätzlichen Tip´s :smile:
Ich gehe mal eins nach dem anderen durch ... ist für mich nicht so einfach.

Meinst du mit einer eigenen "Runnable Klasse" eine eigene Basisklasse ?
 
markus.tullius

markus.tullius

Experte
Er meint eine eigene Klasse, die von Runnable erbt. Am besten benutzt du eine anonyme Klasse.
 
M

Michael68

Neues Mitglied
Ist das so gemeint ?
oder verstehe ich das nicht ganz richtig ?

PHP:
public class Ausgabe extends Activity {
    ProgressDialog progress;
    String result=null;

    InputStream is;
    JSONObject json_data;
    TableLayout table;

    TextView columnOneText;
    TextView columnTwoText;
    TextView columnThreeText;
    
    String columnOneString;
    String columnTwoString;
    String columnThreeString;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.ausgabe);

    Internetverbindung iv = new Internetverbindung();
    iv.initThread();
    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg){
            try {
                JSONArray jArray = new JSONArray(result);
                for(int i=0;i<jArray.length();i++){
                json_data = jArray.getJSONObject(i);
                columnOneString = json_data.getString("userid").toString();
                columnTwoString = json_data.getString("login").toString();
                columnThreeString = json_data.getString("Email").toString();
                fillList();
                }
            }catch(JSONException e){
                Log.e("log_tag", "Error parsing data "+e.toString());
            }
                progress.dismiss();
            }
    };
    
class Internetverbindung implements Runnable{
    
    public void initThread() {
        progress = new ProgressDialog(Ausgabe.this);
//        progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//        progress.setProgress(10);
        progress.setTitle("Daten");
        progress.setMessage("werden geladen...");
        progress.show();
        Thread thread = new Thread(this);
        thread.start();
    }
    
    @Override
    public void run() {
        initView();
        handler.sendEmptyMessage(0);
    }

    private void initView() {
        result = doRequest();
    }
    
     private String doRequest(Void... params) {

            String strUrl = "http://www.xxxxx.de/appentwicklung/ersteapp/app.php";                
            URL url = null;
            StringBuffer sb = new StringBuffer();
            try {
                url = new URL(strUrl);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.connect();
                InputStream iStream = connection.getInputStream();                
                BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));            
                String line = "";                
                while( (line = reader.readLine()) != null){
                    sb.append(line);
                }

                reader.close();
                iStream.close();                            

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }        
            return sb.toString();
        }        
}  //ENDE Class Internetverbindung



@SuppressLint("InlinedApi") public void fillList() {

    table = (TableLayout) findViewById(R.id.TableLayout01);
    TableRow row = new TableRow(this);
    columnOneText = new TextView(this);
    columnTwoText = new TextView(this);
    columnThreeText = new TextView(this);
    columnOneText.setText(columnOneString);
    columnTwoText.setText(columnTwoString);
    columnThreeText.setText(columnThreeString);
    row.addView(columnOneText);
    row.addView(columnTwoText);
    row.addView(columnThreeText);

 table.addView(row,new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    }
}
 
Zuletzt bearbeitet:
Ähnliche Themen - Zeilen in der xml meiner App werden nicht alle angezeigt Antworten Datum
6
17
8