2014-01-30 70 views
0

这是我的示例代码解析JSON数据并将其填充到列表视图,但它给我一个运行时错误?我怎样才能设置联系人名称和密钥到列表视图,我想隐藏的关键,并只查看联系人名称列表,但是当我点击列表视图我想获得与该名称相关的关键。Android的运行时异常,而从网站和填充JSON数据填充ListView

package com.example.myjsonsample; 

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.ProgressDialog; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.ArrayAdapter; 
import android.widget.ListAdapter; 
import android.widget.ListView; 

public class MainActivity extends Activity { 
    private ProgressDialog pDialog; 
    private static String url = "http://192.168.1.2/webandroid/datamanip.php?cat=1"; 

    private static final String TAG_KEY = "key"; 
    private static final String TAG_NAME = "name"; 
    private static final String TAG_LGTIME = "lgtime"; 
    JSONArray contacts = null; 
    String[] contactList; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     contactList = new String[]{}; 
     ListView lv = (ListView) findViewById(R.id.list); 
     new GetContacts(lv).execute(); 

    } 

    @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 class GetContacts extends AsyncTask<Void, Void, Void> { 
     ListView lv ; 
     GetContacts(ListView vl){ 
      lv =vl; 
     } 
     @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       // Showing progress dialog 
       pDialog = new ProgressDialog(MainActivity.this); 
       pDialog.setMessage("Please wait..."); 
       pDialog.setCancelable(false); 
       pDialog.show(); 

      } 
     @Override 
     protected Void doInBackground(Void... arg0) { 
      ServiceHandler sh = new ServiceHandler(); 
      String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET); 
      Log.d("Response: ", "> " + jsonStr); 
      if (jsonStr != null) { 
       try { 

         JSONArray arrJsonArray = new JSONArray(jsonStr); 
        for(int i=0;i<arrJsonArray.length();i++){ 
         JSONObject object = arrJsonArray.getJSONObject(i); 
         Log.d("JSON PARSE",object.getString("key")); 
         Log.d("JSON PARSE",object.getString("name")); 
         Log.d("JSON PARSE",object.getString("lgtime")); 
         contactList[i] =object.getString("name")+"~"+object.getString("key"); 
        } 
       } catch (JSONException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      // Dismiss the progress dialog 
      if (pDialog.isShowing()) 
       pDialog.dismiss(); 
      //this is the question : how to add my key into list view ? i want to start another activity with that key 
      ListAdapter adapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.list_item,contactList); 
      lv.setAdapter(adapter); 
     } 

    } 

} 
+0

有没有这条线的需要 ListView lv;获取联系人(ListView v1){ lv = vl; –

+0

那么如何通过listview对象来填充? – Elshan

回答

0

您需要解析字符串中的contactList(说tempList只包含值),并在retreival的时候,你可以从contactList retreive它在这两个字符串索引值将是相同的。

0

这里

contactList = new String[]{}; //<<< 

初始化数组zero长度,但在添加doInBackground多种元素。因此添加元素之前arrJsonArray.length()初始化数组:

JSONArray arrJsonArray = new JSONArray(jsonStr); 
contactList = new String[<arrJsonArray.length()]; // initialize here 
for(int i=0;i<arrJsonArray.length();i++){ 
    // your code here.... 
    } 
+0

它已经在'onCreate'方法中完成 – Elshan

+1

@Elshan:是的,但是你正在初始化onCreate和doInBackground中的长度为0的数组,试图添加更多的元素 –

+0

ρяσѕρєяK是的,我明白了。 – Elshan

1
contactList[i] = object.getString("name")+"~"+object.getString("key"); 

你已经有一个关键那里contactList内。

设置onItemClickListener到ListView并获得该行像

String value = contactList[position]; 
String key = values.split("~")[1]; // that is the location of the key after spliting the  string 

然后通过密钥值作为参数传递给下一个活动

Intent intent = new Intent(YourCurrentActivity.this, NextActivity.class); 
intent.putExtra("key",key_value_here); 
startActivity(intent); 

希望帮助!

+0

是的我的问题的一部分是解决你的答案,但我有一些线程异常 – Elshan

+0

什么是例外? –