Как распарсить JSON и вывести данные в RecycleView?

249
28 июня 2018, 08:20

как правильно парсить такой json. надо получить следующие данные и выводить в recycleview

(
timeStart
timeEnd
type
adress
title
room
id 
fullname)
    {
    "count": 1,
    "days": [
        {
            "num": "5",
            "count": 2,
            "date": "2017-11-10",
            "lessons": [
                {
                    "timeStart": "18:45",
                    "timeEnd": "20:05",
                    "teacher": {
                        "id": "35020",
                        "fullname": "Лявшук Ирена Александровна",
                        "post": "Старший преподаватель"
                    },
                    "type": "лаб.",
                    "title": "Информатика",
                    "address": "Врублевского, 33",
                    "room": "313",
                    "subgroup": {
                        "id": "7480",
                        "title": "СВС-ТЭЭО-171.3.1"
                    }
                },
                {
                    "timeStart": "20:10",
                    "timeEnd": "21:30",
                    "teacher": {
                        "id": "35020",
                        "fullname": "Лявшук Ирена Александровна",
                        "post": "Старший преподаватель"
                    },
                    "type": "лаб.",
                    "title": "Информатика",
                    "address": "Врублевского, 33",
                    "room": "313",
                    "subgroup": {
                        "id": "7480",
                        "title": "СВС-ТЭЭО-171.3.1"
                    }
                }
            ]
        }
    ]
}

вот код, который уже есть

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<Lessons> listItems;
    private Context context;
    public MyAdapter(List<Lessons> listItems, Context context) {
        this.listItems = this.listItems;
        this.context = context;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.activity_list_item,parent,false);
        return new ViewHolder(view);
    }
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
    }
    @Override
    public int getItemCount() {
        return listItems.size();
    }
    public class ViewHolder extends RecyclerView.ViewHolder{
        public TextView startTextView;
        public TextView endTextView;
        public TextView nameLessonTextView;
        public TextView nameTeacherTextView;
        public TextView adressTextView;
        public TextView numberClassTextView;
        public TextView typeLessonTextView;
        public ViewHolder(View itemView) {
            super(itemView);
            startTextView = itemView.findViewById(R.id.start_time_text_view);
            endTextView = itemView.findViewById(R.id.end_time_text_view);
            nameLessonTextView = itemView.findViewById(R.id.name_lesson_text_view);
            nameTeacherTextView = itemView.findViewById(R.id.name_teacher_text_view);
            adressTextView = itemView.findViewById(R.id.adress_text_view);
            numberClassTextView = itemView.findViewById(R.id.number_class_text_view);
            typeLessonTextView = itemView.findViewById(R.id.type_lesson_text_view);
        }
    }
}
    public class Teacher {
    int id;
    String fullname;
    public Teacher(int id, String fullname) {
        this.id = id;
        this.fullname = fullname;
    }
    public int getId() {
        return id;
    }
    public String getFullname() {
        return fullname;
    }
}

public class Lessons extends ArrayList<Lessons> {
    String timeStart;
    String timeEnd;
    String type;
    String adress;
    String title;
    String room;
    ArrayList<Teacher> teachers;

    public Lessons(String timeStart, String timeEnd, String type, String adress, String title, String room) {
        this.timeStart = timeStart;
        this.timeEnd = timeEnd;
        this.type = type;
        this.adress = adress;
        this.title = title;
        this.room = room;
    }
    public String getTimeStart() {
        return timeStart;
    }
    public String getTimeEnd() {
        return timeEnd;
    }
    public String getType() {
        return type;
    }
    public String getAdress() {
        return adress;
    }
    public String getTitle() {
        return title;
    }
    public String getRoom() {
        return room;
    }
}
    основная activity
    public class RecyclerActivity extends AppCompatActivity {
    private final String URL = "http://api.grsu.by/1.x/app1/getGroupSchedule?studentId=141997&dateStart=10.11.2017&dateEnd=10.11.2017";
    private RecyclerView recyclerView;
    private RecyclerView.Adapter adapter;
    private List<Lessons> listItems;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler);
        recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        listItems = new ArrayList<>();
        loadData(URL);
    }
    private void loadData(String response){
        StringRequest stringRequest = new StringRequest(Request.Method.GET, URL,
                new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    JSONArray jsonArray = jsonObject.getJSONArray("days");
                    String s = jsonArray.toString();
                    JSONObject js = new JSONObject(s);
                    JSONArray ja = js.getJSONArray("lessons");

                    for(int i = 0; i<ja.length();i++){
                        JSONObject jo = ja.getJSONObject(i);

                    /*Lessons lessons = new Lessons(
                                jo.getString("timeStart"),
                                jo.getString("timeEnd"),
                                jo.getString("type"),
                                jo.getString("adress"),
                                jo.getString("title"),
                                jo.getString("room"),
                                jo.getString("")
                        );*/
                        listItems.add(lessons);
                    }
                    adapter = new MyAdapter(listItems, getApplicationContext());
                    recyclerView.setAdapter(adapter);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        },
        new Response.ErrorListener(){
            @Override
            public void onErrorResponse(VolleyError error) {
            }
        });
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }
}
Answer 1

Делать запросы к сети в Активити это очень плохая практика. Для начала почитай те про такие библиотеки как Retrofit2,Gson они помогут делать запросы в сеть и преобразовать json в объект. Далее почитай те про MVP это очень удобно если понимать. По факту вам должен приходить уже готовый объект с класса который занимается работой с сетью в активити там вы передаете этот объект в адаптер и там уже делаете в методе onBindViewHolder

holder.nameLessonTextView.setText(listItems.get(holder.getAdapterPosition).getTitle); 
READ ALSO
Dependencies в Maven [дубликат]

Dependencies в Maven [дубликат]

На данный вопрос уже ответили:

176
Отправка PUSH-уведомлений на устройства Apple: java.lang.IllegalStateException: Channel closed before HTTP/2 preface completed

Отправка PUSH-уведомлений на устройства Apple: java.lang.IllegalStateException: Channel closed before HTTP/2 preface completed

Пытаюсь отправить push-уведомления на устройства AppleИспользую библиотеку:

181
Свой Behavior для View внутри Toolbar в CoordinatorLayout

Свой Behavior для View внутри Toolbar в CoordinatorLayout

Недавно начал изучать CoordinatorLayout и решил написать свой Behavior

174
Как указать главный класс при сборки jar GRADLE

Как указать главный класс при сборки jar GRADLE

Мне нужно указать в buildgradle чтобы он считал главный класс - с методом main был допустим hello

204