0

i want parse json with retrofit2 but my code dose not work

this web service is:(please check the webservice): http://services.groupkt.com/country/search?text=

this is my model class:

public class Country {

    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("alpha2_code")
    @Expose
    private String alpha2Code;
    @SerializedName("alpha3_code")
    @Expose
    private String alpha3Code;

    public String getName() {
        return name;
    }

    public void setName(String name) {
       this.name = name;
    }

    public String getAlpha2Code() {
       return alpha2Code;
    }

    public void setAlpha2Code(String alpha2Code) {
        this.alpha2Code = alpha2Code;
    }

    public String getAlpha3Code() {
        return alpha3Code;
    }

    public void setAlpha3Code(String alpha3Code) {
        this.alpha3Code = alpha3Code;
    }
} 

And:

public class CountryResponse {


    @SerializedName("messages")
    @Expose
    private List<String> messages = null;
    @SerializedName("result")
    @Expose
    private List<Country> countryList = null;


    public List<String> getMessages() {
        return messages;
    }

    public void setMessages(List<String> messages) {
        this.messages = messages;
    }

    public List<Country> getCountryList() {
        return countryList;
    }

    public void setCountryList(List<Country> countryList) {
        this.countryList = countryList;
    }
}

And:

public class Example {


    @SerializedName("RestResponse")
    @Expose
    private CountryResponse restResponse;

    public CountryResponse getRestResponse() {
        return restResponse;
    }

    public void setRestResponse(CountryResponse restResponse) {
       this.restResponse = restResponse;
    }
}

And this is my interface class:

public interface APIInterface {

    @GET("search?text=")
    Call<Example> getCountries();

}

And i write 2 classes for return retrofit object:

public class APIClient {

    private static Retrofit retrofit = null;

    public static Retrofit getClient(String baseUrl) {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder().baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create()).build();
         }
        return retrofit;
    }
}


public class APIUtils {

    public static final String BASE_URL = 
"http://services.groupkt.com/country/";

    public static APIInterface getSOService() {
        return APIClient.getClient(BASE_URL).create(APIInterface.class);
    }
}

My Adapter:

public class ResponseAdapter extends 
RecyclerView.Adapter<ResponseAdapter.ViewHolder> {

    private List<Example> mItems;
    private Context mContext;
    Example example;
    CountryResponse countyResponse;

    public ResponseAdapter(Context context, Example example) {

        this.example = example;
        mContext = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.item_list, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        Example example = mItems.get(position);
        TextView textView = holder.name;

        textView.setText(example.getRestResponse()
                .getCountryList().get(position).getName());

        TextView textView1 = holder.alpha;

        textView1.setText(example.getRestResponse().
                  getCountryList().get(position).getAl
                                   pha2Code());

        TextView textView2 = holder.alpha2;


          textView2.setText(example.getRestResponse().
                    getCountryList().get(position).getAl
                             pha3Code());

}

    @Override
    public int getItemCount() {
        return mItems.size();
    }

    public void updateAnswers(CountryResponse countryRes) {
        countyResponse = countryRes;
        notifyDataSetChanged();
    }

    private Example getItem(int adapterPosition) {
        return mItems.get(adapterPosition);
    }


     public interface PostItemListener {
        void onPostClick(long id);
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView name, alpha, alpha2;

        public ViewHolder(View itemView) {
            super(itemView);

            name = (TextView) itemView.findViewById(R.id.name);
            alpha = (TextView) itemView.findViewById(R.id.alpha);
            alpha2 = (TextView) itemView.findViewById(R.id.alpha2);
        }
    }
}

And My Activity:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_response);
        apiInterface= APIUtils.getSOService();
        mRecyclerView= (RecyclerView) findViewById(R.id.my_recycler_view);
        mAdapter=new ResponseAdapter(this,new Example());

        RecyclerView.LayoutManager layoutManager = new 
LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setAdapter(mAdapter);
        mRecyclerView.setHasFixedSize(true);

        loadAnswers();
    }

    private void loadAnswers() {

        apiInterface.getCountries().enqueue(new Callback<Example>() {
            @Override
            public void onResponse(Call<Example> call, Response<Example> 
 response) {
                mAdapter.updateAnswers(response.body().getRestResponse());
            }

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

            }
        });
    }

when run a error showing that

'java.util.Iterator java.util.List.iterator()' on a null object reference

Amir251251
  • 19
  • 7

1 Answers1

3

You have

@Override
public int getItemCount() {
    return mItems.size();
}

public void updateAnswers(CountryResponse countryRes) {
    countyResponse = countryRes;
    notifyDataSetChanged();
}

Your List is not initialized in the first place. Secondly you need to populate your List with items. And your list must be Country list not of type Example

You need to change to

public void updateAnswers(CountryResponse countryRes) {
    mItems.addAll(countryRes.getCountryList())
    notifyDataSetChanged();
}

And also initialize the list

List<Country> mItems = new ArrayList();
// note its of type Country not of Example

Finally update your views accordingly in onBindViewHolder

textView.setText(mItems.get(position).getName());
textView1.setText(mItems.get(position).getAlpha2Code());
textView2.setText(mItems.get(position).getAlpha3Code());
Raghunandan
  • 132,755
  • 26
  • 225
  • 256