2015-05-02 413 views
0

我需要你的帮助(我再次知道)我试图从PHP的Web服务检索JSON格式的文件,并将它显示在Android手机的列表视图中。解析JSON时ArrayIndexOutOfBoundsException

我对PHP服务OK,因为这是工作的罚款

但是我不能说对部分相同的Android部分。今天我从一些教程中努力做到了这一点,但仍然无济于事。

我目前收到一个ArrayIndexOutOfBoundsException异常,一般我发现很容易调试,但是这是不是这样今天

ANDROID代码

显示图片类

package com.example.alex.documentupload; 

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; 

import com.example.alex.documentupload.JSONParser; 

public class ShowImages extends Activity { 
    ListView list; 
    TextView ver; 
    TextView name; 
    TextView api; 
    Button Btngetdata; 
    ArrayList<HashMap<String, String>> oslist = new ArrayList<HashMap<String, String>>(); 

    //URL to get JSON Array 
    private static String url = "http://www.500kgiveaway.co.uk/getimagesmob.php"; 

    //JSON Node Names 
    private static final String TAG_PATH = "path"; 

    JSONArray android = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_show_images); 
     oslist = new ArrayList<HashMap<String, String>>(); 

     Btngetdata = (Button)findViewById(R.id.getdata); 
     Btngetdata.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       new JSONParse().execute(); 

      } 
     }); 

    } 

    private class JSONParse extends AsyncTask<String, String, JSONArray> { 
     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(ShowImages.this); 
      pDialog.setMessage("Getting Data ..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(true); 
      pDialog.show(); 

     } 

     @Override 
     protected JSONArray doInBackground(String... args) { 

      JSONParser jParser = new JSONParser(); 

      // Getting JSON from URL 
      JSONArray json = jParser.getJSONFromUrl(url); 
      return json; 
     } 
     @Override 
     protected void onPostExecute(JSONArray json) { 
      pDialog.dismiss(); 
      try { 
       // Getting JSON Array from URL 


       android = json; 


       for(int i = 0 ; i < android.length(); i++){ 

        JSONObject c = android.getJSONObject(i); 

        // Storing JSON item in a Variable 
        String path = c.getString(TAG_PATH); 

        // Adding value HashMap key => value 

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

        map.put(TAG_PATH, path); 

        oslist.add(map); 
        list=(ListView)findViewById(R.id.list); 

        ListAdapter adapter = new SimpleAdapter(ShowImages.this, oslist, 
          R.layout.list_v, 
          new String[] { TAG_PATH }, 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(ShowImages.this, "You Clicked at "+oslist.get(+position).get("name"), Toast.LENGTH_SHORT).show(); 

         } 
        }); 

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

     } 
    } 

} 

JSONParser类

package com.example.alex.documentupload; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
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.util.Log; 

public class JSONParser { 

    static InputStream is = null; 
    static JSONArray jObj = null; 
    static String json = ""; 

    // constructor 
    public JSONParser() { 

    } 

    public JSONArray getJSONFromUrl(String url) { 

     // Making HTTP request 
     try { 
      // defaultHttpClient 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      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 parse the string to a JSON object 
     try { 
      jObj = new JSONArray(json); 
     } catch (JSONException e) { 
      Log.e("JSON Parser", "Error parsing data " + e.toString()); 
     } 

     // return JSON String 
     return jObj; 

    } 
} 

PHP JSON输出

[ 
{ 
path: "upload/images/1430572021716.jpg" 
}, 
{ 
path: "upload/images/1430574003703.jpg" 
}, 
{ 
path: "upload/images/1430574124119.jpg" 
}, 
{ 
path: "upload/images/1430574203001.jpg" 
}, 
{ 
path: "upload/images/1430575264003.jpg" 
}, 
{ 
path: "upload/images/1430576559782.jpg" 
} 
] 

堆栈跟踪

05-02 22:00:48.536 22773-22773/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.alex.documentupload, PID: 22773 
    java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 
      at android.widget.SimpleAdapter.bindView(SimpleAdapter.java:160) 
      at android.widget.SimpleAdapter.createViewFromResource(SimpleAdapter.java:126) 
      at android.widget.SimpleAdapter.getView(SimpleAdapter.java:114) 
      at android.widget.AbsListView.obtainView(AbsListView.java:2768) 
      at android.widget.ListView.measureHeightOfChildren(ListView.java:1280) 
      at android.widget.ListView.onMeasure(ListView.java:1192) 
      at android.view.View.measure(View.java:17633) 
      at android.widget.RelativeLayout.measureChild(RelativeLayout.java:689) 
      at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:473) 
      at android.view.View.measure(View.java:17633) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5428) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at android.view.View.measure(View.java:17633) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5428) 
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1413) 
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:696) 
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:589) 
      at android.view.View.measure(View.java:17633) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5428) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2588) 
      at android.view.View.measure(View.java:17633) 
      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2347) 
      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1439) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1653) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1297) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6773) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:613) 
      at android.view.Choreographer.doFrame(Choreographer.java:583) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:799) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:146) 
      at android.app.ActivityThread.main(ActivityThread.java:5748) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 
      at dalvik.system.NativeStart.main(Native Method) 

回答

1

您的问题似乎是在这里。

ListAdapter adapter = new SimpleAdapter(ShowImages.this, oslist, 
R.layout.list_v, 
new String[] { TAG_PATH }, new int[] { 
R.id.vers, R.id.name, R.id.api}); 

字符串数组长度与整数之一不匹配,因此超出了界限异常。

+0

感谢您的及时回应。你能推荐一个修补程序吗? – PowerMan2015

+0

new String [] {“1234”,“4567”,“8910”} ...不确定你想在这里,所以我只是垃圾邮件一些数字 –

+0

我刚刚删除了名称和API的参考,因为他们不是需要。这解决了这个问题。感谢您的帮助 – PowerMan2015

0

你逝去的参数来创建适配器对象

ListAdapter adapter = new SimpleAdapter(ShowImages.this, oslist, 
R.layout.list_v, 
new String[] { TAG_PATH }, new int[] { 
R.id.vers, R.id.name, R.id.api}); 

TAG_PATH有一个值和整数数组在创建适配器通过有三个。字符串数组大小和整数数组大小不匹配。这是ArrayIndexOutOfBound的原因。