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 атрибута, которые
отвечают за то, как элемент будет располагаться и отображаться в интерфейсе.
Рассмотрим некоторые из них:
-
android:layout_width=»match_parent» и android:layout_height=»match_parent» — отвечают за то,
сколько пространства будет занимать элемент на экране — в нашем случае — все доступное пространство родительского
элемента -
android:layout_marginStart=»8dp
android:layout_marginEnd=»8dp»
android:layout_marginBottom=»8dp» — внешние отступы элемента — отображаются также как и margin
в html -
android:scrollbars=»horizontal» — добавляется горизонтальная прокрутка, если элемент не помещается на экран.
4.app:layout_constraintBottom_toBottomOf=»parent»
app:layout_constraintEnd_toEndOf=»parent»
app:layout_constraintStart_toStartOf=»parent»
app:layout_constraintTop_toTopOf=»parent» — определяют положение всего элемента на макете
как положение сторон элемента относительно сторон родительского элемента (но не только).
- 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.