Daten aus einer Datenbank mit JSON in eine ListView

  • 20 Antworten
  • Letztes Antwortdatum
J

jeffhammer

Neues Mitglied
0
Guten Tag

Ich bin kurz vor dem verzweifeln und hoffe ihr könnt mir kurz helfen.

Zu meinem Problem:
Ich habe einen WebServer, wo ich mit einem .php Script eine JSON auswerfe. so siet dies aus. (ist nur ein Beispiel)

{"success":1,"message":"Post Available!","posts":[{"id":"5","man1":"hiudbsnk","man2":"nkdfsnko","date":null}]}

Einen JSONParser hab ich auch schon geschrieben.

Nun muss ich die 4 Wörter, also die ip, man1, man2, date in eine ListView schreiben und die auf dem Bildschirm ausgeben. die id sollte dan nur als Listenordnung dienen also welche zu oberst und welche zu unterst.

Wie mach ich das am besten? Über eine ArrayList oder einfach über Strings?
Und wie schreib ich das am besten in meinen Code?

Besten Dank schon im voraus, und danke für euer verständniss.
 
Warum nimmst du nicht gleich das in Android vorhandene JSON-Objekt? Sparste dir ein bisschen Aufwand und hast genau das was du brauchst ;)
 
Wie soll ich das den schreiben? Hättest du mir kurz eine beschreibung?
 
Hallo.

Hier ist auch noch ein gutes Tutorial, wie du mit JSON Daten umgehen kannst.
How to connect Android with PHP, MySQL

Ab Punkt 7 kommt der für dich relevante Teil.

Was du dann noch brauchen wirst ist ein selbst geschriebener ListViewAdapter. Durch diesen kannst du dann bestimmen was in einem Eintrag der ListView angezeigt wird.
Ich bin zwar ein Anfänger, aber vllt hilft dir das ein bißchen. Sollte es kompletter Blödsinn sein, bitte verbessert mich.

Bsp eines ListViewAdapters:
Code:
public class ListViewAdapterEKL extends CursorAdapter {
…
@Override
public void bindView(View view, Context context, Cursor cursor) {
// Werte aus dem Cursor auslesen
int id = cursor.getInt(cursor.getColumnIndex("id"));
String man1 = cursor.getString(cursor.getColumnIndexOrThrow("man1"));
...
// Name setzen
TextView tv_man1 = (TextView) view.findViewById (R.id.tv_man1);
if (name != null) {
tv_man1.setText(man1);
}
…
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View v = mLayoutInflater.inflate(R.layout.DEIN_LAYOUT, parent, false);
return v;
Aufruf:
Es wird ein Cursor mit den Daten übergeben
Code:
            private ListViewAdapter myAdapter;             
            ...
            Cursor curDaten -> enthält die Daten des JSON Response
    
            ListView myList = (ListView) getActivity().findViewById(android.R.id.list);
            if (curDaten != null) {
                myAdapter = new ListViewAdapter(getActivity(), curDaten);
                myList.setAdapter(myAdapter);
            } else {
                myList.setAdapter(null);
            }
Vielleicht bringt dich das ja ein bißchen in die richtige Richtung.
Da ich das meißte aus dem Kopf getippt habe kann es sein das nicht alles perfekt ist, aber es dient vllt als Anhaltspunkt.

lg, cyp
 
Ich persönlich bin ja Fan von
https://code.google.com/p/google-gson/

Damit ist Json Handling so viel einfacher.
Du musst nur eine Klasse haben, die die gleichen variablen hat wie der Json String (vom Namen her) und gson baut dir das fertige Objekt daraus ohne das du noch was tun musst
 
Vielen dank für die guten antworten ich werde es mal ausprobieren.

DANKE
 
Habs mal ausprobiert aber kam nicht zum ergebniss app lief aber sobalt ich den butten wo die list view drinn is antippe stürzt sie ab
 
Mit welchem Fehler?
 
jeffhammer schrieb:
Habs mal ausprobiert aber kam nicht zum ergebniss app lief aber sobalt ich den butten wo die list view drinn is antippe stürzt sie ab

Hallo.

Kannst du bitte einmal den LogCat-Output posten.
Ohne eine Beschreibung wie der Fehler aussieht können wir dir nicht helfen.
Vllt. kannst du ja auch noch kurz beschreiben, wie du es jetzt umgesetzt hast.

lg, cyp
 
Ich habe es bei mir so gelöst:
Ausgabe eines JSON-Arrays über PHP, lesen über einen JSON-Parser. Anschließend aus dem JSON-Array die einzelnen Variablen in eine ArrayList eingetragen und dann einen in Adapter geschrieben und gesetzt.

Das ist so im groben was du wohl machen musst ;)
 
Guten Tag.

also folgender fehler kommt:
667-667/com.example.app E/AndroidRuntime FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.Championhsip}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'

mein code:

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;

public class Championhsip extends ListActivity {

private static String url = "http://wettendoko.npx.de/Spiel.php";

private static final String TAG_ID = "id";
private static final String TAG_MAN1 = "man1";
private static final String TAG_MAN2 = "man2";
private static final String TAG_DATE = "date";

JSONArray spiele = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_championhsip);
setContentView(R.id.list);
ListView mylistview = (ListView) findViewById(R.id.list);

// Hashmap for ListView
ArrayList<HashMap<String, String>> listview = new ArrayList<HashMap<String, String>>();

// Creating JSON Parser instance$
JSONParser jParser = new JSONParser();

// getting JSON string from URL
JSONObject json = jParser.getJSONFromUrl(url);

try {
// Getting Array of Contacts
spiele = json.getJSONArray(TAG_MAN1);

// looping through All Contacts
for(int i = 0; i < spiele.length(); i++){
JSONObject c = spiele.getJSONObject(i);

// Storing each json item in variable
String id = c.getString(TAG_ID);
String man1 = c.getString(TAG_MAN1);
String man2 = c.getString(TAG_MAN2);
String date = c.getString(TAG_DATE);


// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();

// adding each child node to HashMap key => value
map.put(TAG_ID, id);
map.put(TAG_MAN1, man1);
map.put(TAG_MAN2, man2);
map.put(TAG_DATE, date);

// adding HashList to ArrayList
listview.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
}

/**
* Updating parsed JSON data into ListView
* */
ListAdapter adapter = new SimpleAdapter(this, listview,
R.layout.support_simple_spinner_dropdown_item,
new String[] { TAG_MAN1, TAG_MAN2, TAG_DATE }, new int[] {
R.id.man1, R.id.man2, R.id.date });

setListAdapter(adapter);

// selecting single ListView item
ListView lv = getListView();

// Launching new screen on Selecting Single ListItem


}
}



was mach ich falsch layout hab ich einam mit einer Listview und einmal mit den TextView die ich brauche.

Danke
 
Evtl liegt es daran das du beim setContentView den ListView(?) setzen willst.

So versucht er die ListView als Layout zu verwenden.
Also einfach den zweiten setContentView löschen ;)
 
Ah tut mir leid aber auch dan geht es nicht
 
Were um hilfe sehr dankbar. Bin kurz vor den verzweifeln.:sad:
 
Hallo.

Könntest du bitte auch noch den Inhalt des Layouts (support_simple_spinner_dropdown_item) posten.

Wenn möglich benutz bitte die Option "Code einfügen" (Raute Symbol) wenn du hier im Forum Code postest.

lg, cyp

----------------
Edit:

Probier zuerst wie von joshua1996 beschrieben die Zeile setContentView(R.id.list); zu löschen.
Das gehört hier nicht hin.
 
Da hab ich nix eingegeben ist aus m tutorial. Häte sonst nicht funktioniert. Ist wohl dies der fehler. Wo sollte den dies eingegeben werden. Hab bei mir einfach ganz normales layout erstellt listview eingeschriben. Bei dem listview layout hab ich einfach die verschidenen textview eingeschriben sonst nix also standarteinstellungen.

Wo sollten diese dan hin?
 
Du kannst hier Code im Forum Posten, indem du im erweitertem Editor das Raute-Symbol drückst, oder indem du "
Code:
" dein Code.... "
" schreibst (ohne " ").

Nutzt du nur eine ListView ohne irgend welche Erweiterungen? Also eine einfache ListView, in der nur Strings angezeigt werden. Denn ich wundere mich grade warum du R.layout.support_simple_spinner_drodown_item stehen hast.
Willst du die Daten in einen Spinner machen ODER in eine ListView?
Wenn du es in eine ListView schreiben willst, dann müsstest du
R.layout.support_simple_spinner_drodown_item

mit:
android.R.layout.simple_list_item_1

Ersetzen.
Ich denke mal das wir dir besser helfen können wenn du das Layout hier postest (wie schon empfohlen :D )

EDIT:
Code:
    [_CODE_]
     Dein Code (ohne die "_")
    [_/CODE_]
Er wollte ihn oben nicht anzeigen :D
 
Zuletzt bearbeitet:
Hallo.

Ich habe es nun schnell selbst ausprobiert.

activity_main.xml
Code:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="4dp"
        android:layout_marginTop="4dp" >

    </ListView>

</RelativeLayout>
list_item.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/pid"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" />

    <TextView
        android:id="@+id/tv_ip"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="6dip"
        android:paddingTop="6dip"
        android:text="IP" />

    <TextView
        android:id="@+id/tv_man1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="6dip"
        android:paddingTop="6dip"
        android:text="man1" />

    <TextView
        android:id="@+id/tv_man2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="6dip"
        android:paddingTop="6dip"
        android:text="man2" />

    <TextView
        android:id="@+id/tv_date"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="6dip"
        android:paddingTop="6dip"
        android:text="date" />

</LinearLayout>
MainActivity.java
Code:
package com.example.listviewtest;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.http.NameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ListActivity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class MainActivity extends ListActivity {

    // Creating JSON Parser object
    JSONParser jParser = new JSONParser();

    ArrayList<HashMap<String, String>> itemList;
    
    private static String url_getitems = "http://192.168.1.8/android_connect/get_all_items.php";
 
    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_ITEMS = "items";
    private static final String TAG_ID = "id";
    private static final String TAG_IP = "ip";
    private static final String TAG_MAN1 = "man1";
    private static final String TAG_MAN2 = "man2";
    private static final String TAG_DATE = "date";
    
    // JSONArray fuer die Items
    JSONArray items = null;
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // Hashmap fuer die ListView
        itemList = new ArrayList<HashMap<String, String>>();
        
        //AsyncTask zum laden der Daten vom Server
        try {
            new GetItems().execute();
        } catch (Exception e) {
            Log.d("myError", "ERROR: Aufruf -> GetItems " + e.toString());
            e.printStackTrace();
        }
        
        ListView lv = getListView();
        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(getApplicationContext(),"ID: " + String.valueOf(id) + " Position: " + String.valueOf(position) ,Toast.LENGTH_SHORT).show();    
            }
        });
    }


    /*
     * AsyncTask zum Laden der Items vom Server
     */
    class GetItems extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... arg0) {
            
            // Parameter zusammenstellen
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            // JSON String der URL holen
            JSONObject json = jParser.makeHttpRequest(url_getitems, "GET", params);
            
            try {
                // check ob erfolgreich
                int success = json.getInt(TAG_SUCCESS);
 
                if (success == 1) {
                    // Array der Items auslesen
                    items = json.getJSONArray(TAG_ITEMS);
 
                    // durch alle Items durchgehen
                    for (int i = 0; i < items.length(); i++) {
                        JSONObject c = items.getJSONObject(i);
 
                        // jedes Item in einer Variable speichern
                        String id = c.getString(TAG_ID);
                        String ip = c.getString(TAG_IP);
                        String man1 = c.getString(TAG_MAN1);
                        String man2 = c.getString(TAG_MAN2);
                        String date = c.getString(TAG_DATE);
                        
                        // HashMap erstellen
                        HashMap<String, String> map = new HashMap<String, String>();
 
                        // zur HashMap hinzufuegen im Stile 'key => value'
                        map.put(TAG_ID, id);
                        map.put(TAG_IP, ip);
                        map.put(TAG_MAN1, man1);
                        map.put(TAG_MAN2, man2);
                        map.put(TAG_DATE, date);
 
                        // HashList zur ArrayList hinzufuegen
                        itemList.add(map);
                    }
                } else {
                    // ...
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
 
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            
            ListAdapter adapter = new SimpleAdapter(
                    MainActivity.this, 
                    itemList,
                    R.layout.list_item, 
                    new String[] { TAG_ID, TAG_IP, TAG_MAN1, TAG_MAN2, TAG_DATE},
                    new int[] { R.id.pid, R.id.tv_ip, R.id.tv_man1, R.id.tv_man2, R.id.tv_date });
            setListAdapter(adapter);
        }

    }
    

}
JSONParser.java
Code:
package com.example.listviewtest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;
 
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
 
import android.util.Log;
 
public class JSONParser {
 
    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
 
    // constructor
    public JSONParser() {
 
    }
 
    public JSONObject makeHttpRequest(String url, String method,
            List<NameValuePair> params) {
 
        // Making HTTP request
        try {
            if(method == "POST"){
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));
 
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
 
            }else if(method == "GET"){
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);
 
                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }          
 
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        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();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
 
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        return jObj;
 
    }
}
get_all_items.php
Code:
<?php

$response = array();
 
require_once __DIR__ . '/db_connect_bac.php';
$db = new DB_CONNECT();
 
$result = mysql_query("SELECT *FROM test") or die(mysql_error());
 
if (mysql_num_rows($result) > 0) {
    $response["items"] = array();
 
    while ($row = mysql_fetch_array($result)) {
        $item = array();
        $item["id"] = $row["id"];
        $item["ip"] = $row["ip"];
        $item["man1"] = $row["man1"];
        $item["man2"] = $row["man2"];
        $item["date"] = $row["date"];
        array_push($response["items"], $item);
    }
    $response["success"] = 1;
    echo json_encode($response);
} else {
    $response["success"] = 0;
    $response["message"] = "No Item found";
    echo json_encode($response);
}
?>
Bei mir funktioniert auf diese Art alles.
2dmgkf6.png


Wenn du willst, kann ich dir auch das Projekt hochladen, was aber dann am Sinn des lernens vorbeigeht :flapper:.

lg, cyp
 
Zuletzt bearbeitet:
Danke viel mal für für die gute antwort bin froh drüber. Schau mir das zuhause mal genuer an und versuch es mal für mich zu importieren. Wart mir eine sehr gute hilfe danke an alle:biggrin:
 
Zurück
Oben Unten