2017-09-04 55 views
1

我試圖解析這個Json數組從這個網站NewsApi並顯示它在一個listView.When我運行應用程序沒有顯示。這裏是我的code.What做錯了嗎?我試圖調試這個問題無濟於事。無法解析JSON使用改造和使用listView

公共類NewsApiClient {

public static String API_BASE_URL = "https://newsapi.org/v1/"; 

公共靜態OkHttpClient.Builder的HttpClient =新OkHttpClient.Builder();

public static Retrofit.Builder builder = new Retrofit.Builder() 
     .baseUrl(API_BASE_URL) 
     .addConverterFactory(GsonConverterFactory.create() 
     ); 

public static Retrofit retrofit = builder.client(httpClient.build()).build(); 

NewsApiClient client = retrofit.create(NewsApiClient.class); 

}

調用終點?

public interface NewsApiInterface { 
    //endpoint 
     @GET("sources") 
     Call <SourcesResponse> getTechSources(
       @Query("language") String language, 
       @Query("category") String category) 
    } 

我只使用名稱,描述和類別屬性。

public class Source { 

     @SerializedName("id") 
     public String id; 

     @SerializedName("name") 
     public String name; 

     @SerializedName("description") 
     public String description; 

     @SerializedName("url") 
     public String url; 

     @SerializedName("category") 
     public String category; 

     @SerializedName("language") 
     public String language; 

     @SerializedName("country") 
     public String country; 


    } 


public class SourcesAdapter extends BaseAdapter { 

     Context context; 
     List<Source> sourceList; 

     public SourcesAdapter(Context context,List<Source> sourceList){ 
      this.context = context; 
      this.sourceList = sourceList; 
     } 

     @Override 
     public int getCount() { 
      return sourceList.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return sourceList.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      LayoutInflater layoutInflater = LayoutInflater.from(context); 

      convertView = layoutInflater.inflate(R.layout.sources_list,null); 
      Source currentsource = sourceList.get(position); 

      TextView sourcesName = (TextView) convertView.findViewById(R.id.sources_name); 
      TextView sourcesDescription = (TextView) convertView.findViewById(R.id.sources_description); 
      TextView sourcesCategory = (TextView) convertView.findViewById(R.id.sources_category); 

      sourcesName.setText(currentsource.name); 
      sourcesDescription.setText(currentsource.description); 
      sourcesCategory.setText(currentsource.category); 



      return convertView; 
     } 
    } 


public class SourcesFragment extends Fragment { 

ListView listView; 
    public SourcesFragment() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     // Inflate the layout for this fragment 
     // 
     //instance of the adapter to this listview 
     View view = inflater.inflate(R.layout.fragment_sources, container, false); 
     listView = (ListView)view.findViewById(R.id.list_view_sources) ; 


     getSources(); 
     return view; 


    } 

     public void getSources(){ 
      Retrofit retrofit = NewsApiClient.builder.build(); 

      NewsApiInterface newsApiInterface = retrofit.create(NewsApiInterface.class); 

      Call<SourcesResponse> sourcesCall = newsApiInterface.getTechSources("en", "technology"); 
      sourcesCall.enqueue(new Callback<SourcesResponse>() { 
       @Override 
       public void onResponse(Call<SourcesResponse> call, Response<SourcesResponse> response) { 

        List<Source> sources = response.body().sources; 
        SourcesAdapter sourcesAdapter = new SourcesAdapter(getContext(),sources); 
        listView.setAdapter(sourcesAdapter); 

       } 

       @Override 
       public void onFailure(Call<SourcesResponse> call, Throwable t) { 

       } 
      }); 



     } 

    } 


public class SourcesResponse {  

    @SerializedName("status")  
    public String status;   

    @SerializedName("sources")  

    public List<Source> sources; 

} 

    I have created 3 fragments,the sources fragment is one of them.On the sources fragment i only want to display sources with technology.        
         Thank you in advance!   
+0

「我有試圖調試這個問題無濟於事。「 您的調試嘗試是否會產生LogCat? – FWeigl

+0

@Ascorbin,是的。 – Olal

回答

0

在你改造的onResponse回調方法,您要訪問像response.body().sources源列表。取而代之的是在SourcesResponse,添加一個getter和setter的來源是這樣

public List<SourcesResponse> getSources() { 
    return sources; 
} 

public void setSources(List<SourcesResponse> sources) { 
    this.sources = sources; 
} 

現在去改造你的onResponse回調,改變

response.body().sources 

response.body().getSources()