2014-10-01 4 views
0

json 데이터를 사용자 지정 목록보기로 가져 오려고합니다. 앱을 실행하면 빈 레이아웃 파일 만 표시됩니다.사용자 지정 목록보기에서 JSON 결과 가져 오기

여기 http://api.androidhive.info/feed/feed.json

에서 JSON 소스 내가

this is main activity class 

package com.example.jsonexample; 

import java.net.URL; 

import org.json.JSONObject; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.widget.ListView; 
import android.widget.TextView; 

public class MainActivity extends Activity { 




TextView name,email; 
handlexml obj; 
//String url="http://api.androidhive.info/volley/person_object.json"; 
//String url="http://api.androidhive.info/feed/feed.json"; 
ListView lv; 


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

    //name=(TextView)findViewById(R.id.textView1); 
    //email=(TextView)findViewById(R.id.textView2); 

    lv=(ListView)findViewById(R.id.listView1); 

    lv.setAdapter(new adapterforlist(this)); 


    //open(); 



    } 

@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; 
} 

/*public void open() 
{ 
    obj = new handlexml(url); 

    obj.fetchJSON(); 



    name.setText(obj.getname()); 
    email.setText(obj.getemail()); 



}*/ 


} 

이 사용자 정의 목록보기 어댑터

package com.example.jsonexample; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

public class adapterforlist extends BaseAdapter{ 

    Context context; 
    TextView tv1,tv2; 
    handlexml jobj; 

    String url="http://api.androidhive.info/feed/feed.json"; 
    //String url="http://api.androidhive.info/volley/person_object.json"; 

    public adapterforlist(Context c) { 
     // TODO Auto-generated constructor stub 
     this.context=c; 

    } 

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

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

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

    @Override 
    public View getView(int arg0, View rootview, ViewGroup viewgrp) { 
     // TODO Auto-generated method stub 

     LayoutInflater ll = (LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 


     rootview=ll.inflate(R.layout.custom, null, true); 
     tv1=(TextView)rootview.findViewById(R.id.textView1); 
     tv2=(TextView)rootview.findViewById(R.id.textView2); 

     jobj= new handlexml(url); 
     jobj.fetchJSON(); 

     while(jobj.parsingcomplete) 
     { 
      tv1.setText(jobj.getname()); 
      tv2.setText(jobj.getemail()); 
     } 




     return rootview; 
    } 

} 

입니다 무엇을했는지이다이 JSON 페치 및 파싱 클래스에게 있습니다

package com.example.jsonexample; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

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

public class handlexml { 

    String name; 
    String email; 
    String stringurl; 
    boolean parsingcomplete=true; 


    public handlexml(String url){ 

     this.stringurl=url; 

     } 


    public String getname() { 
     return name; 
    } 


    public String getemail() { 

     return email; 
    } 



    public void readandparseJSON (String in) { 

     try { 
      JSONObject reader = new JSONObject(in); 

      JSONArray feed = reader.getJSONArray("feed"); 

      JSONObject reader1= feed.getJSONObject(feed.length()); 

      for (int i=0; i<=reader1.length();i++) 
      { 
       name=reader1.getString("name"); 
       email= reader1.getString("url"); 
      } 




      parsingcomplete= false; 


     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    public void fetchJSON() { 
     Thread thread = new Thread(new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       try { 
        URL url=new URL(stringurl); 

        HttpURLConnection conn= (HttpURLConnection)url.openConnection(); 

        conn.setConnectTimeout(15000); 
        conn.setReadTimeout(10000); 
        conn.setRequestMethod("GET"); 
        conn.setDoInput(true); 

        conn.connect(); 


        InputStream stream = conn.getInputStream(); 

        String data =convertStreamToString(stream); 

        readandparseJSON(data); 
        stream.close(); 


       } catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 




      } 
     }); 

     thread.start(); 

    } 

    static String convertStreamToString(java.io.InputStream is) { 
      java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); 
      return s.hasNext() ? s.next() : ""; 
     } 


} 

이 주요 XML 파일

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 

</LinearLayout> 

입니다이가 각 항목에 대해 불리는 listadapter

<?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/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Large Text" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Small Text" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

</LinearLayout> 
+0

Volley 라이브러리를 사용하는 것이 좋습니다. – GVillani82

+0

getView 내에서 REST 호출을해서는 안됩니다. getView는 목록의 단 하나의 단일 행만을 반환합니다. 먼저 데이터를로드 한 다음 구문 분석 한 다음 Adapter에 구문 분석 된 Java 모델 (목록)을 추가 한 다음 getView()에서 목록 항목보기를 펼치고 구문 분석 된 목록에서 색인 '위치'에있는 항목을 가져옵니다. , 뷰 내에서 데이터를 설정하고 getView 메소드에서 뷰를 리턴하십시오. –

+0

@ Damian walczac 나는이 방법을 asyncktask와 함께 시도했지만 행운은 없다. 응용 프로그램이 강제 종료되었습니다. –

답변

2

에 대한 사용자 정의 XML 파일 당신은 당신의 BaseAdapter 클래스의 jobj.fetchJSON() 메소드를 호출하지 않아야이다 목록에. 이렇게하면 응용 프로그램이 너무 느려집니다.

우선 모든 데이터를 BaseAdapter 클래스에 제공해야합니다. 가장 많이 사용되는 방법은이 데이터를 생성자에 제공하는 것입니다. 그래서, 당신의 기본 어댑터 클래스 생성자와의 getView 방법은 다음과 같아야합니다

public class adapterforlist extends BaseAdapter{ 

    ... 
    private List<Feed> feeds; 
    public adapterforlist(Context c, List<Feed> feedsList) { 
     this.context=c; 
     this.feeds = feedsList; 
    } 

    @Override 
    public View getView(int position, View rootview, ViewGroup viewgrp) { 

     LayoutInflater ll = (LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 

     rootview=ll.inflate(R.layout.custom, null, true); 
     tv1=(TextView)rootview.findViewById(R.id.textView1); 
     tv2=(TextView)rootview.findViewById(R.id.textView2); 

     // Create each item of the listView with every item of the data provided via constructor. 
     Feed feed = feeds.get(position); 
     tv1.setText(feed.getname()); 
     tv2.setText(feed.getemail()); 

     return rootview; 
    } 
    ... 
} 

을 지금,이 작업을 수행 할 수있는 당신이 다음이 필요합니다 :

  1. 클래스를 만들기가를 대표하는 먹이. 간단한 POJO (Plain Old Java Object) 일 수 있습니다.
  2. Feed 개체 목록을 채우고 생성자를 통해 BaseAdapter에 삽입합니다.

피드 POJO는 다음과 같아야합니다

public class Feed { 

    private String name; 
    private String email; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getEmail() { 
     return email; 
    } 
    public void setEmail(String email) { 
     this.email = email; 
    } 

} 

그리고이 방법으로 만들 수 있습니다 피드 객체의 목록을;

public List<Feed> readandparseJSON (String in) { 

    List<Feed> feeds = new ArrayList<Feed>(); 

    try { 
     JSONObject reader = new JSONObject(in); 
     JSONArray feed = reader.getJSONArray("feed"); 
     JSONObject reader1= feed.getJSONObject(feed.length()); 

     for (int i=0; i<=reader1.length();i++) 
     { 
      Feed feed = new Feed(); 
      feed.setName(reader1.getString("name")); 
      feed.setUrl(reader1.getString("url")); 
      feeds.add(feed); 
     } 

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

    return feeds; 

} 

질문이 있으시면 알려주세요.

관련 문제