Android: Не парсится JSON и не выводятся в listview

278
14 сентября 2017, 15:25

Я пишу REST клиент, для парсинга JSON'a, я использую для этого Retrofit 2.

При нажатии на кнопку, должен спарситься JSON и вывести их параметры (String) в listview. Но я не могу понять в чем именно проблема, проблема в парсинге или же в отображении в listView?

JSON:

[{"id":3,"titleRu":"горячие напитки","titleEng":"hot beverages","url":"www.artlabteam.com/beverages","imageUrl":"www.artlabteam.com/img3.jpg","weight":1,"menuId":1,"status":1},{"id":4,"titleRu":"горячие напитки","titleEng":"hot beverages","url":"www.artlabteam.com/beverages","imageUrl":"www.artlabteam.com/img3.jpg","weight":1,"menuId":1,"status":1},{"id":5,"titleRu":"горячие напитки","titleEng":"hot beverages","url":"www.artlabteam.com/beverages","imageUrl":"www.artlabteam.com/img3.jpg","weight":1,"menuId":1,"status":1}]

До парсинга: http://joxi.ru/Dr8vpq9F4qyxg2
После парсинга: http://joxi.ru/DrlNDdMFvq3Yn2 - как видно, 3 листа создались (вместо 6), но они пустые.

MainActivity.java - я успешно дохожу до строчки Log.d(TAG, "Я в блоке if (response.isSuccessful())");

public class MainActivity extends AppCompatActivity {
    public static final String TAG = "TAG";
    private ListView listView;
    private View     parentView;
    private ArrayList<Contact> contactList;
    private ContactAdapter     adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        contactList = new ArrayList<>();
        listView = (ListView) findViewById(R.id.listView);
        parentView = findViewById(R.id.parentLayout);
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        assert fab != null;
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(@NonNull final View view) {
                /**
                 * Checking Internet Connection
                 */
                if (InternetConnection.checkConnection(getApplicationContext())) {
                    final ProgressDialog dialog;
                    /**
                     * Progress Dialog for User Interaction
                     */
                    dialog = new ProgressDialog(MainActivity.this);
                    dialog.setTitle(getString(R.string.string_getting_json_title));
                    dialog.setMessage(getString(R.string.string_getting_json_message));
                    dialog.show();
                    //Creating an object of our api interface
                    ApiService api = RetroClient.getApiService();
                    /**
                     * Calling JSON
                     */
                    Call<List<Contact>> call = api.getMyJSON();
                    /**
                     * Enqueue Callback will be call when get response...
                     */
                    call.enqueue(new Callback<List<Contact>>() {
                        @Override
                        public void onResponse(Call<List<Contact>> call, Response<List<Contact>> response) {
                            Log.d(TAG, "Я в onResponse ");
                            //Dismiss Dialog
                            dialog.dismiss();
                            if (response.isSuccessful()) {
                                /**
                                 * Got Successfully
                                 */
                                contactList.addAll(response.body());
                                Log.d(TAG, "Я в блоке if (response.isSuccessful())");
                                /**
                                 * Binding that List to Adapter
                                 */
                                adapter = new ContactAdapter(MainActivity.this, contactList);
                                listView.setAdapter(adapter);
                            } else {
                                Snackbar.make(parentView, R.string.string_some_thing_wrong, Snackbar.LENGTH_LONG).show();
                            }
                        }
                        @Override
                        public void onFailure(Call<List<Contact>> call, Throwable t) {
                            dialog.dismiss();
                        }
                    });
                } else {
                    Snackbar.make(parentView, R.string.string_internet_connection_not_available, Snackbar.LENGTH_LONG).show();
                }
            }
        });
    }
}

ContactAdapter.java

public class ContactAdapter extends ArrayAdapter<Contact> {
    List<Contact> contactList;
    Context       context;
    private LayoutInflater mInflater;
    // Constructors
    public ContactAdapter(Context context, List<Contact> objects) {
        super(context, 0, objects);
        this.context = context;
        this.mInflater = LayoutInflater.from(context);
        contactList = objects;
    }
    @Override
    public Contact getItem(int position) {
        return contactList.get(position);
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder vh;
        if (convertView == null) {
            View view = mInflater.inflate(R.layout.layout_row_view, parent, false);
            vh = ViewHolder.create((RelativeLayout) view);
            view.setTag(vh);
        } else {
            vh = (ViewHolder) convertView.getTag();
        }
        Contact item = getItem(position);
        vh.textViewTitleRu.setText(item.getTitleRu());
        vh.textViewTitleEng.setText(item.getTitleEng());
        return vh.rootView;
    }
    private static class ViewHolder {
        public final RelativeLayout rootView;
        public final TextView       textViewTitleRu;
        public final TextView       textViewTitleEng;
        private ViewHolder(RelativeLayout rootView, TextView textViewTitleRu, TextView textViewTitleEng) {
            this.rootView = rootView;
            this.textViewTitleRu = textViewTitleRu;
            this.textViewTitleEng = textViewTitleEng;
        }
        public static ViewHolder create(RelativeLayout rootView) {
            TextView textViewTitleRu = (TextView) rootView.findViewById(R.id.textViewTitleRu);
            TextView textViewTitleEng = (TextView) rootView.findViewById(R.id.textViewTitleEng);
            return new ViewHolder(rootView, textViewTitleRu, textViewTitleEng);
        }
    }
}

ApiService:

public interface ApiService {
    @GET("menuserver5/categories")
    Call<List<Contact>> getMyJSON();
}

RetroClient.java

public class RetroClient {
    private static final String ROOT_URL = "http://139.59.164.239:8080/";
    private static Retrofit getRetrofitInstance() {
        return new Retrofit.Builder()
                .baseUrl(ROOT_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    public static ApiService getApiService() {
        return getRetrofitInstance().create(ApiService.class);
    }
}

Contact.java

public class Contact {
    @SerializedName("id")
    @Expose
    private String id;
    @SerializedName("title_ru")
    @Expose
    private String titleRu;
    @SerializedName("title_eng")
    @Expose
    private String titleEng;
    @SerializedName("url")
    @Expose
    private String url;
    @SerializedName("img_url")
    @Expose
    private String imageUrl;
    @SerializedName("weight")
    @Expose
    private int weight;
    @SerializedName("menu_id")
    @Expose
    private int menuId;
    @SerializedName("status")
    @Expose
    private int status;
    /**
     * @return The id
     */
    public String getId() {
        return id;
    }
    /**
     * @return The name
     */
    public String getTitleRu() {
        return titleRu;
    }
    /**
     * @return The email
     */
    public String getTitleEng() {
        return titleEng;
    }
    public String getUrl() {
        return url;
    }
    public String getImageUrl() {
        return imageUrl;
    }
    public int getWeight() {
        return weight;
    }
    public int getMenuId() {
        return menuId;
    }
    public int getStatus() {
        return status;
    }
}
Answer 1

В аннотации SerializedName у вас snake_case когда в json camleCase

Для корректной генерации классов по json или json-схемам рекомендую http://www.jsonschema2pojo.org/

Ещё может быть проблема (а может и не быть проблемы) в отсутствии конструктора со всеми полями.

public Contact() {}
/**
* 
* @param id
* @param titleRu
* @param weight
* @param status
* @param imageUrl
* @param titleEng
* @param menuId
* @param url
*/
public Contact(Integer id, String titleRu, String titleEng, String url, String imageUrl, Integer weight, Integer menuId, Integer status) {
    super();
    this.id = id;
    this.titleRu = titleRu;
    this.titleEng = titleEng;
    this.url = url;
    this.imageUrl = imageUrl;
    this.weight = weight;
    this.menuId = menuId;
    this.status = status;
}
READ ALSO
ajax работа с всплывающими окнами

ajax работа с всплывающими окнами

Есть раскрывающееся по наведению курсора меню, работа которого протестированаЕсть список

276
Удаление файлов в папке по дате Java (JSP)

Удаление файлов в папке по дате Java (JSP)

Не получается удалить старые файлы в папке через JSP по датеИмеется класс для удаления файлов (DeleteFile

285
css анимация прокрука на 180градусов

css анимация прокрука на 180градусов

делаю анимацию прокрутка блока на 180градусов

213