Android приложение для показа новостей из RSS. Часть 2

Доброго времени суток! В прошлой статье мы рассмотрели базовые компоненты создаваемого Android
приложения
, а в этой рассмотрим уже непосредственно код приложения.

Итак, код большинства Android приложений начинается с класса под названием MainActivity — главное окно
приложения (хотя класс этот можно назвать и по-другому, главное, чтобы он имел соответствующие атрибуты в файле манифеста).
Каждому окну (активити в терминологии Android) соответствует свой файл макета. Макет — это
xml-разметка окна
, сильно напоминающая html-код стандартной web-страницы, и файлу MainActivity
соответствует макет activity_main.xml в папке src/main/res/layout.

Класс MainActivity, расположенный в папке src/main/java/ru.myrusakov.rssapp загружает этот макет,
который затем показывается пользователю.

Давайте посмотрим на файл MainActivity:


package ru.myrusakov.rssapp

import android.os.Bundle
import android.view.View
import android.widget.AdapterView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import ru.myrusakov.rssapp.network.ApiClient
import ru.myrusakov.rssapp.data.RSSChannel

// главный класс приложения
class MainActivity : AppCompatActivity() {

    // выводит список элементов
    private lateinit var recyclerView: RecyclerView

    // ссылка на rss-ленту - она в формате xml
    private var rssURL = "https://career.habr.com/vacancies/rss?currency=RUR&sort=relevance&type=all"

    // основной метод любой активити, в которой загружается и устанавливается макет
    // а также выполняются другие действия
    override fun onCreate(savedInstanceState: Bundle?) {
        // вызываем метод родительского класса
        super.onCreate(savedInstanceState)
        // устанавливаем макет
        setContentView(R.layout.activity_main)

        // получаем ссылку на xml-элемент для вывода списков
        recyclerView = findViewById(R.id.recyclerView);
        // устанавливаем сетку из одного (1) элемента - можете поменять на 2 или на 3
        recyclerView.layoutManager = GridLayoutManager(this, 1)

        // загружаем данные по ссылке и отображаем в интерфейсе
        getFeed(rssURL)
    }

    private fun getFeed(channelUrl: String) {

        // получаем ссылку на сервис, которые загружает данные из Интернета
        val api = ApiClient.apiService

        // асинхронная загрузка
        api.getRssFeed(channelUrl).enqueue(object : Callback<RSSChannel> {

            // обработчик в случае ошибки
            override fun onFailure(call: Call<RSSChannel>, t: Throwable) {

            }

            // обработчик при успешной загрузке
            override fun onResponse(call: Call<RSSChannel>, response: Response<RSSChannel>)
            {
                // если тело ответа непустое
                if(response.body() != null) 
                {
                    // отображаем данные в интерфейсе через специально созданный адаптер
                    recyclerView.adapter =
                        FeedItemsRecyclerAdapter(baseContext, response.body().item)
                    //adapter.notifyDataSetChanged()
                }
                else
                {
                    Toast.makeText(baseContext, "Что-то пошло не так, попробуйте позже :(", Toast.LENGTH_SHORT).show();
                }
            }
        })
    }

}

Теперь рассмотрим файл разметки — activity_main.xml

Каждый файл разметки должен содержать один единственный корневой
xml-элемент (тэг)
*Layout. У каждого элемента есть как минимум 2 атрибута, которые
отвечают за то, как элемент будет располагаться и отображаться в интерфейсе.

Рассмотрим некоторые из них:

  1. android:layout_width=»match_parent» и android:layout_height=»match_parent» — отвечают за то,
    сколько пространства будет занимать элемент на экране — в нашем случае — все доступное пространство родительского
    элемента

  2. android:layout_marginStart=»8dp
    android:layout_marginEnd=»8dp»
    android:layout_marginBottom=»8dp» — внешние отступы элемента — отображаются также как и margin
    в html

  3. android:scrollbars=»horizontal» — добавляется горизонтальная прокрутка, если элемент не помещается на экран.

4.app:layout_constraintBottom_toBottomOf=»parent»
app:layout_constraintEnd_toEndOf=»parent»
app:layout_constraintStart_toStartOf=»parent»
app:layout_constraintTop_toTopOf=»parent» — определяют положение всего элемента на макете
как положение сторон элемента относительно сторон родительского элемента (но не только).

  1. androidx.recyclerview.widget.RecyclerView — отображает список элементов

<?xml version="1.0" encoding="utf-8"?>
<!-- 
    Корневой элемент - специальный

-->
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!--
        Элемент в котором будет отображаться список,
        заполняет все пространство родительского элемента.
        Добавляются небольшие отступы (margins) с каждой из сторон.
    -->
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:scrollbars="horizontal"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:listitem="@layout/recyclerview_item" />

</androidx.constraintlayout.widget.ConstraintLayout>

Таким образом, сегодня мы с Вами рассмотрели еще один кусочек нашего Android приложения для чтения
RSS-каналов
. А в следующих статьях мы рассмотрим остальные его части, в том числе и веб-сервис на PHP,
который будет отвечать за преобразование RSS-XML в JSON
.

Источник