Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
}

android {
Expand Down Expand Up @@ -29,6 +30,10 @@ android {
kotlinOptions {
jvmTarget = '1.8'
}

viewBinding {
enabled true
}
}

dependencies {
Expand All @@ -37,6 +42,10 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.5.0'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.github.bumptech.glide:glide:4.14.2'
kapt 'com.github.bumptech.glide:compiler:4.14.2'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.androidlab_22_23">

<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
Expand Down
16 changes: 15 additions & 1 deletion app/src/main/java/com/example/androidlab_22_23/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,24 @@ package com.example.androidlab_22_23

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.androidlab_22_23.databinding.ActivityMainBinding
import com.example.androidlab_22_23.fragments.MainFragment

class MainActivity : AppCompatActivity() {
private var binding: ActivityMainBinding? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
binding = ActivityMainBinding.inflate(layoutInflater).also {
setContentView(it.root)
}
binding?.run {
supportFragmentManager.beginTransaction().setCustomAnimations(
com.google.android.material.R.anim.abc_fade_in,
com.google.android.material.R.anim.abc_fade_out,
com.google.android.material.R.anim.abc_fade_in,
com.google.android.material.R.anim.abc_fade_out
)
.add(R.id.fragment_container, MainFragment()).commit()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.example.androidlab_22_23.adapter

import android.view.LayoutInflater
import android.view.ViewGroup
import android.view.animation.AnimationUtils
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.RequestManager
import com.example.androidlab_22_23.model.Character
import com.example.androidlab_22_23.R
import com.example.androidlab_22_23.databinding.ItemCharacterBinding

class CharacterAdapter(
private val list: List<Character>,
private val glide: RequestManager,
private val action: (Character) -> Unit,
) : RecyclerView.Adapter<CharacterHolder>() {

override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): CharacterHolder = CharacterHolder(
binding = ItemCharacterBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
),
glide = glide,
action = action
)

override fun onBindViewHolder(
holder: CharacterHolder,
position: Int
) {
holder.onBind(list[position])
holder.itemView.animation =
AnimationUtils.loadAnimation(holder.itemView.context, R.anim.scale)
}

override fun getItemCount(): Int = list.size
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.example.androidlab_22_23.adapter

import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Priority
import com.bumptech.glide.RequestManager
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.RequestOptions
import com.example.androidlab_22_23.model.Character
import com.example.androidlab_22_23.R
import com.example.androidlab_22_23.databinding.ItemCharacterBinding

class CharacterHolder(
private val binding: ItemCharacterBinding,
private val glide: RequestManager,
private val action: (Character) -> Unit,
) : RecyclerView.ViewHolder(binding.root) {

private val option = RequestOptions
.diskCacheStrategyOf(DiskCacheStrategy.ALL)
.priority(Priority.HIGH)

fun onBind(character: Character) {
with(binding) {
tvTitle.text = character.name
tvDesc.text = character.affiliation

glide
.load(character.cover)
.apply(option)
.fitCenter()
.placeholder(R.drawable.load)
.error(R.drawable.error)
.into(ivCover)

root.setOnClickListener {
action(character)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.example.androidlab_22_23.fragments

import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment
import com.bumptech.glide.Glide
import com.example.androidlab_22_23.model.Character
import com.example.androidlab_22_23.model.CharacterRepository
import com.example.androidlab_22_23.R
import com.example.androidlab_22_23.databinding.FragmentInfoBinding


class InfoFragment : Fragment(R.layout.fragment_info) {
private var binding: FragmentInfoBinding? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val idFromBundle: Int? = arguments?.getInt(ARG_ID_VALUE)
binding = FragmentInfoBinding.bind(view)
val toolbar = view.findViewById(R.id.toolbar) as Toolbar
(activity as AppCompatActivity?)!!.setSupportActionBar(toolbar)
if ((activity as AppCompatActivity?)!!.supportActionBar != null) {
(activity as AppCompatActivity?)!!.supportActionBar!!.setDisplayHomeAsUpEnabled(false)
}
val character: Character = CharacterRepository.characters[idFromBundle!!]
binding?.run {

val uri: Uri = Uri.parse(character.cover)
Log.e("uri", uri.toString())
Glide.with(requireContext())
.load(uri)
.into(ivIcon)
tvName.text = "Имя: ${character.name}\n"
tvAffiliation.text = "Принадлежность: ${character.affiliation}\n"
tvDesc.text = "Описание: ${character.description}\n"
tvHistory.text = "История: \n\n${character.history}"
}
}

companion object {
private const val ARG_ID_VALUE = "arg_id_value"

fun newInstance(id: Int) = InfoFragment().apply {
arguments = Bundle().apply {
putInt(ARG_ID_VALUE, id)
}
}
}

override fun onDestroyView() {
super.onDestroyView()
binding = null
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.example.androidlab_22_23.fragments

import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.example.androidlab_22_23.adapter.CharacterAdapter
import com.example.androidlab_22_23.model.CharacterRepository
import com.example.androidlab_22_23.R
import com.example.androidlab_22_23.databinding.FragmentMainBinding

class MainFragment : Fragment(R.layout.fragment_main) {
private var binding: FragmentMainBinding? = null
private var adapter: CharacterAdapter? = null

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = FragmentMainBinding.bind(view)

binding?.run {
val itemDecoration: RecyclerView.ItemDecoration =
DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL)
adapter = CharacterAdapter(
list = CharacterRepository.characters,
glide = Glide.with(this@MainFragment)
) {
parentFragmentManager.beginTransaction().setCustomAnimations(
com.google.android.material.R.anim.abc_fade_in,
com.google.android.material.R.anim.abc_fade_out,
com.google.android.material.R.anim.abc_fade_in,
com.google.android.material.R.anim.abc_fade_out
)
.replace(R.id.fragment_container, InfoFragment.newInstance(it.id))
.addToBackStack("ToMainFragment").commit()
}
rvCharacter.adapter = adapter
rvCharacter.layoutManager = LinearLayoutManager(requireContext())
rvCharacter.addItemDecoration(itemDecoration)
}
}

override fun onDestroyView() {
super.onDestroyView()
binding = null
}
}
10 changes: 10 additions & 0 deletions app/src/main/java/com/example/androidlab_22_23/model/Character.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.androidlab_22_23.model

data class Character(
val id: Int,
val name: String,
val affiliation: String,
val cover: String,
val description: String,
val history: String,
)
Loading