JSON-объекты на примере списка карточек (CardView)

Добавлено: 27/03/2017 01:02 |  Обновлено: 08/05/2018 13:45 |  Добавил: nick |  Просмотры: 5873 Комментарии: 0
Вводная часть
Этот материал является продолжением материалов: «RecyclerView и CardView в Android» и «Диалоговые окна в Android», так что для лучшего понимания, прежде всего, следует ознакомиться с их содержимым.
Напоминаю, что в отдельном файле Card.java у нас был простой класс для формирования объектов карточек (материал «RecyclerView и CardView в Android»). Эти объекты мы создавали в активности (ScrollingActivity.java). В данном материале переделаем класс Card для работы с массивом JSON-объектов, так как после этого каждая карточка будет представлять именно JSON-объект. Отредактированный код файла Card.java будет следующим:
public class Card {
    String title;
    String content;
    static JSONArray cards = new JSONArray();

    Card(String title, String content) {
        this.title = title;
        this.content = content;
    }

    public JSONArray create() throws JSONException {
        JSONObject object = new JSONObject();
        object.put("title", title);
        object.put("content", content);
        cards.put(object);
        return cards;
    }
}
В методе create() мы создаем новый JSON-объект и добавляем его в массив карточек.

Каким же образом мы будем создавать новую карточку? Для этого воспользуемся диалоговыми окнами, реализованными в материале «Диалоговые окна в Android».

Напомню, что в активности у нас есть метод onDialogPositiveClick() для обработки события нажатия по кнопке в диалоговом окне. Теперь в него мы также должны передать содержимое текстовых полей ввода для заглавия/названия (title) и содержимого (content) карточки. Делаем мы это из файла AddDialogFragment.java, который отвечает за создание фрагмента для диалога. Теперь его содержимое будет следующим:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();
    view = inflater.inflate(R.layout.dialog_add, null);
    builder.setView(view)
            .setPositiveButton(R.string.dialog_positive_button, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {
                    title = (EditText) view.findViewById(R.id.title);
                    content = (EditText) view.findViewById(R.id.content);
                    mListener.onDialogPositiveClick(AddDialogFragment.this, title, content);
                }
            });
    return builder.create();
}
Вернувшись к активности, в методе onDialogPositiveClick() мы теперь можем получить значения из текстовых полей:
@Override
public void onDialogPositiveClick(DialogFragment dialog, EditText title, EditText content) {
    addNewCard(title.getText().toString(), content.getText().toString());
}
Как видно из кода выше полученные данные обрабатываются в методе addNewCard():
private void addNewCard(String title, String content){
    Card card = new Card(title, content);
    try {
        card.create();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    resetAdapter(card.cards);
}

private void resetAdapter(JSONArray cards){
    RVAdapter adapter = new RVAdapter(cards);
    rv.setAdapter(adapter);
}
Как раз в методе card.create(), класса Card (см. выше), мы и создаем новую карточку.

Теперь осталось вывести список карточек. Для этого отредактируем файл RVAdapter.java с адаптером, который заполняет компоненты TextView (title и content) для всех карточек. Его измененный код будет следующим:
public class RVAdapter extends RecyclerView.Adapter<RVAdapter.CardViewHolder> {

    JSONArray cards;

    public static class CardViewHolder extends RecyclerView.ViewHolder {

        CardView cardView;

        CardViewHolder(CardView cv) {
            super(cv);
            cardView = cv;
        }
    }

    RVAdapter(JSONArray cards){
        this.cards = cards;
    }

    @Override
    public CardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        CardView cv = (CardView) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.cardview, parent, false);
        return new CardViewHolder(cv);
    }

    @Override
    public void onBindViewHolder(CardViewHolder cardViewHolder, int position) {
        CardView cardView = cardViewHolder.cardView;
        TextView title = (TextView)cardView.findViewById(R.id.title);
        TextView content = (TextView)cardView.findViewById(R.id.content);
        try {
            JSONObject jsonObject = cards.getJSONObject(position);
            title.setText(jsonObject.getString("title"));
            content.setText(jsonObject.getString("content"));
        }catch (JSONException e) {
            e.printStackTrace();
        }

    }

    @Override
    public int getItemCount() {
        return cards.length();
    }
}

Оставьте свой комментарий

Комментариев нет