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

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

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
.

Источник

НЕТ КОММЕНТАРИЕВ

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