2012-04-17 62 views
1

你好我是新的android,所以請讓我知道我錯了。如何使用AsyncTask將json數組顯示到列表視圖?

我想將jsonarray轉換成自定義listview.I嘗試了很多,但我沒有得到解決方案。 我得到了我想要的strValue1的值(請檢查下面的代碼,Activites_Activity.java)。 現在,我想將這個strValue1傳遞給列表視圖。 但我無法將其轉換爲列表視圖。

請讓我知道我該怎麼辦?

我得到了錯誤

04-17 12:52:55.795: E/AndroidRuntime(765): FATAL EXCEPTION: AsyncTask #1 
04-17 12:52:55.795: E/AndroidRuntime(765): java.lang.RuntimeException: An error occured    while executing doInBackground() 
04-17 12:52:55.795: E/AndroidRuntime(765): at android.os.AsyncTask$3.done(AsyncTask.java:200) 
04-17 12:52:55.795: E/AndroidRuntime(765): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
04-17 12:52:55.795: E/AndroidRuntime(765): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
04-17 12:52:55.795: E/AndroidRuntime(765): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
04-17 12:52:55.795: E/AndroidRuntime(765): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
04-17 12:52:55.795: E/AndroidRuntime(765): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
04-17 12:52:55.795: E/AndroidRuntime(765): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
04-17 12:52:55.795: E/AndroidRuntime(765): at java.lang.Thread.run(Thread.java:1096) 
04-17 12:52:55.795: E/AndroidRuntime(765): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
04-17 12:52:55.795: E/AndroidRuntime(765): at android.view.ViewRoot.checkThread(ViewRoot.java:2802) 
04-17 12:52:55.795: E/AndroidRuntime(765): at android.view.ViewRoot.focusableViewAvailable(ViewRoot.java:1596) 
04-17 12:52:55.795: E/AndroidRuntime(765): at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:451) 
04-17 12:52:55.795: E/AndroidRuntime(765): at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:451) 
04-17 12:52:55.795: E/AndroidRuntime(765): at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:451) 
04-17 12:52:55.795: E/AndroidRuntime(765): at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:451) 
04-17 12:52:55.795: E/AndroidRuntime(765): at android.view.View.setFlags(View.java:4474) 
04-17 12:52:55.795: E/AndroidRuntime(765): at android.view.View.setFocusableInTouchMode(View.java:3104) 
04-17 12:52:55.795: E/AndroidRuntime(765): at android.widget.AdapterView.checkFocus(AdapterView.java:694) 
04-17 12:52:55.795: E/AndroidRuntime(765): at android.widget.ListView.setAdapter(ListView.java:437) 
04-17 12:52:55.795: E/AndroidRuntime(765): at com.rahul.cheerfoolz.activites.Activites_Activity$activites.doInBackground(Activites_Activity.java:141) 
04-17 12:52:55.795: E/AndroidRuntime(765): at com.rahul.cheerfoolz.activites.Activites_Activity$activites.doInBackground(Activites_Activity.java:1) 
04-17 12:52:55.795: E/AndroidRuntime(765): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
04-17 12:52:55.795: E/AndroidRuntime(765): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
04-17 12:52:55.795: E/AndroidRuntime(765): ... 4 more 

感謝。

Activites_Activity.java

public class Activites_Activity extends CheerfoolznativeActivity { 

TextView txtactivity; 
ListView list; 
LazyAdapter adapter; 
ImageView img; 
ProgressBar pgb; 

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

    setContentView(R.layout.activity_activites); 
    setHeader("Activites"); 

/* 
    list=(ListView)findViewById(R.id.activity_listView); 
    adapter=new LazyAdapter(this, mImages,mTitle); 
    list.setAdapter(adapter); 
*/ 
    txtactivity = (TextView) findViewById(R.id.activity_textView); 
    img=(ImageView)findViewById(R.id.activity_image); 
    pgb = (ProgressBar)findViewById(R.id.activity_progressBar); 
    new activites().execute(); 
} 

public class activites extends AsyncTask<Void, Void, Void> { 
    String parsedString = "\n"; 
    String strValue1 ; 
    public int i=0; 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     pgb.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
     String url = " Here my json URL "; 

     String strResponse = util.makeWebCall(url); 

     try { 
      JSONObject objResponse = new JSONObject(strResponse); 

      JSONArray jsonnodes = objResponse.getJSONArray(API.cheerfoolz_activities.NODES); 
      Log.i(" NO of entries===>" +Activites_Activity.class.getName(),"Number of entries " + jsonnodes.length()); 

      ArrayList<String> items = new ArrayList<String>(); 

      for (i = 0; i < jsonnodes.length(); i++) 
      { 
       String str = Integer.toString(i); 
       Log.i("Value of i",str); 

       JSONObject jsonnode = jsonnodes.getJSONObject(i); 

       JSONObject jsonnodevalue = jsonnode.getJSONObject(API.cheerfoolz_activities.NODE); 

       strValue1 = jsonnodevalue.getString(API.cheerfoolz_activities.TITLE); 

       Log.i("JSONArray", strValue1); 
       //parsedString += " \n\n Value of stored parse : => " + strValue1; 
       parsedString = parsedString.trim(); //this will remove the blank white space 

       items.add(strValue1); 

       parsedString += " \n Value added in list => " + items; 

       Log.i("Value of items : ", parsedString); 



      } 


      //List<String> list = Arrays.asList((String[])jsonnodes.toString()); 
      //String[] values= new String[]{items.toString()}; 
      //myListView.setListAdapter(

      /* list=(ListView)findViewById(R.id.activity_listView); 
       // adapter=new LazyAdapter((Activity) getApplicationContext(), mImages,mTitle); 
       list.setAdapter(adapter);*/ 

      ListView myListView = (ListView)findViewById(R.id.activity_listView); 
      myListView.setAdapter(new ArrayAdapter(getApplicationContext(), android.R.layout.simple_expandable_list_item_1, items)); 

    //  ArrayAdapter<String> adapter= new ArrayAdapter<String>(Activites_Activity.this, android.R.layout.simple_list_item_1,items); 
    //  myListView.setAdapter(adapter); 
      //Log.i("contact", items1); 

     } 
     catch (JSONException e) { 

      e.printStackTrace(); 
      txtactivity.setText(e.getMessage()); 

     } 

     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     // TODO Auto-generated method stub 
     super.onProgressUpdate(values); 
    } 

    @Override 
    public void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 

     txtactivity.setText(parsedString); 
     pgb.setVisibility(View.GONE); 
     //img.setImageResource(parsedString); 
    } 
} 

} 

LazyAdapter.java

public class LazyAdapter extends BaseAdapter{ 

private Activity context; 
private String[] title; 
private String[] images; 
private LayoutInflater inflater; 


public LazyAdapter(Activity context,String[] img ,String[] title) { 
    super(); 

    this.context = context; 
    this.title = title; 
    this.images = img; 

    this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return title.length; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

public static class ViewHolder 
{ 
    ImageView imgViewLogo; 
    TextView txtViewTitle; 

} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    ViewHolder holder; 
    if(convertView==null) 
    { 
     holder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.activity_listitem, null); 

     holder.imgViewLogo = (ImageView) convertView.findViewById(R.id.activity_list_logo); 
     holder.txtViewTitle = (TextView) convertView.findViewById(R.id.activity_list_title); 

     convertView.setTag(holder); 
    } 
    else 
     holder=(ViewHolder)convertView.getTag(); 

// holder.imgViewLogo.setImageResource(images[position]); 
    holder.txtViewTitle.setText(title[position]); 


    return convertView; 
} 

} 

makeWebCall.class

public static String makeWebCall(String url) { 

    DefaultHttpClient client = new DefaultHttpClient(); 

    HttpGet httpRequest = new HttpGet(url); 

    try { 

     HttpResponse httpResponse = client.execute(httpRequest); 

     final int statusCode = httpResponse.getStatusLine().getStatusCode(); 

     if (statusCode != HttpStatus.SC_OK) { 
      /* Log.i(getClass().getSimpleName(), 
       "Error => " + statusCode + " => for URL " + url);*/ 
      return null; 
     } 

     HttpEntity entity = httpResponse.getEntity(); 
      InputStream is = entity.getContent(); 
      return iStream_to_String(is); 
    } 
    catch (IOException e) { 
     httpRequest.abort(); 
     // Log.w(getClass().getSimpleName(), "Error for URL =>" + url, e); 
    } 

    return null; 

} 


public static String iStream_to_String(InputStream is1) 
{ 
    BufferedReader rd = new BufferedReader(new InputStreamReader(is1), 4096); 
    String line; 
    StringBuilder sb = new StringBuilder(); 
    try { 
     while ((line = rd.readLine()) != null) { 
       sb.append(line); 
     } 
     rd.close(); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    String contentOfMyInputStream = sb.toString(); 
    return contentOfMyInputStream; 
} 

回答

0

假設你的ListView的修改是正確的,然後將下面的代碼:

ListView myListView = (ListView)findViewById(R.id.activity_listView); 
      myListView.setAdapter(new ArrayAdapter(getApplicationContext(), android.R.layout.simple_expandable_list_item_1, items)); 

AsyncTaskdoInBackground方法轉換爲onPostExecute函數。您不能從doInBackground內部修改任何View,您必須在確保在事件派發線程上運行的回調函數之一中執行此操作。

+0

謝謝,它的作品! – 2012-04-17 08:06:30

相關問題