无法使用改进解析JSON并使用listView

时间:2017-09-04 11:38:47

标签: android json listview retrofit

我尝试从此站点Json解析此NewsApi数组并将其显示在listView中。当我运行应用程序时,没有显示任何内容。这是我的代码。出错了什么?我试图调试问题无济于事。

公共类NewsApiClient {

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

public static OkHttpClient.Builder httpClient = new 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!        

1 个答案:

答案 0 :(得分: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()