2016-03-22 3 views
1

Я пытаюсь создать приложение для Android, которое получает данные из базы данных MySQL в приложение для Android. Я после этого учебника: http://www.geeks.gallery/simple-json-parsing-example-in-android-part-iii/текст, загруженный с сервера mysql, не отображается в виде списка

проблема появляется, как я, нажав на кнопку, которая загрузить данные в ListView, по какой-то причине текст не отображается в этом списке. Поскольку я следил за кодом, я остро заметил, что правильные данные вставлены в соответствующую соответствующую хэш-карту «oslist».

любые предложения? спасибо, Ханан

activity_main.xml

<LinearLayout 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:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" 
    android:weightSum="1" 
    android:orientation="vertical"> 


    <ListView 
    android:id="@+id/list" 
    android:layout_width="wrap_content" 
    android:layout_height="335dp" 
    android:layout_above="@+id/getdata" 
     android:choiceMode="singleChoice" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="load data" 
     android:id="@+id/getdata" 
     android:layout_gravity="center_horizontal" /> 


</LinearLayout> 

main_activity.java

package com.example.aradline; 

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

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

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.Button; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 
/** Called when the activity is first created. */ 
ListView list; 
TextView ver; 
TextView name; 
TextView api; 
ArrayList<HashMap<String, String>> oslist = new ArrayList<>(); 


private static String url = "http://www.geeks.gallery/android/android_version_json_data.php"; 
private static final String TAG_OS = "Android Version List"; 
private static final String TAG_VER = "Version No"; 
private static final String TAG_NAME = "Version Name"; 
private static final String TAG_API = "API Level"; 

JSONArray android = null; 

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

    Button getdata = (Button) findViewById(R.id.getdata); 
    getdata.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      new JSONParse().execute(); 
     } 
    }); 

    list = (ListView) findViewById(R.id.list); 

    ListAdapter adapter = new SimpleAdapter(MainActivity.this, oslist, 
      R.layout.list_child, 
      new String[] { TAG_VER, TAG_NAME, TAG_API }, new int[] { 
      R.id.vers, R.id.name, R.id.api }); 
    list.setAdapter(adapter); 
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
           int position, long id) { 
      Toast.makeText(MainActivity.this, 
        "You Clicked at " + oslist.get(+position).get("name"), 
        Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

private class JSONParse extends AsyncTask<String, String, JSONObject> { 
    private ProgressDialog pDialog; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     ver = (TextView) findViewById(R.id.vers); 
     name = (TextView) findViewById(R.id.name); 
     api = (TextView) findViewById(R.id.api); 
     pDialog = new ProgressDialog(MainActivity.this); 
     pDialog.setMessage("Getting Data ..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 

    @Override 
    protected JSONObject doInBackground(String... args) { 
     JsonParser jParser = new JsonParser(); 
// Getting JSON from URL 
     JSONObject json = jParser.getJSONFromUrl(url); 
     return json; 
    } 

    @Override 
    protected void onPostExecute(JSONObject json) { 

     pDialog.dismiss(); 
     try { 
// Getting JSON Array from URL 
      android = json.getJSONArray(TAG_OS); 


      for (int i = 0; i < android.length(); i++) { 
       JSONObject c = android.getJSONObject(i); 
// Storing JSON item in a Variable 
       String name = c.getString(TAG_NAME); 
       String ver = c.getString(TAG_VER); 
       String api = c.getString(TAG_API); 


// Adding value HashMap key => value 
       HashMap<String, String> map = new HashMap<>(); 

       map.put(TAG_VER, ver); 
       map.put(TAG_NAME, name); 
       map.put(TAG_API, api); 

       oslist.add(map); 

      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
} 

list_child.xml

<?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/name" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    /> 
<TextView 
    android:id="@+id/vers" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    /> 

<TextView 
    android:id="@+id/api" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    /> 
</LinearLayout> 

ответ

0

Попробуйте сделать все это ListAdapter adapter = new SimpleAdapter(MainActivity.this, oslist, R.layout.list_child, new String[] { TAG_VER, TAG_NAME, TAG_API }, new int[] { R.id.vers, R.id.name, R.id.api }); list.setAdapter(adapter);

в onPostExecute после oslist.add(map).

Я думаю, что это происходит потому, что, если вы установили адаптер, ваш список вакансий пуст. и после того, как вы добавите все данные, адаптер не знает, что ему нужно обновить. попробуйте также, если у вас есть .notifychange() метод в адаптере. я не уверен, что у вас есть это на таком адаптере.

1

Вы создаете адаптер списка, прежде чем получать данные с сервера. В то время ваш oslist пуст и, следовательно, вы не сможете увидеть какие-либо данные в списке. Вы должны обновить свой список после получения данных с сервера. Лучшее место в onPostExecute()

В onPostExecute() оных -

adapter = new SimpleAdapter(MainActivity.this, oslist, 
      R.layout.list_child, 
      new String[] { TAG_VER, TAG_NAME, TAG_API }, new int[] { 
      R.id.vers, R.id.name, R.id.api }); 
    adapter.notifyDataSetChanged(); 

после

oslist.add(map); 
+0

решить эту проблему, спасибо :-) – OscarB

Смежные вопросы