MainActivity
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.neco_desarrollo.plantshandbook.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
lateinit var binding: ActivityMainBinding
private val adapter = PlantAdapter()
private val imageIdList = listOf(
R.drawable.plant1,
R.drawable.plant2,
R.drawable.plant3,
R.drawable.plant4,
R.drawable.plant5,
)
private var index = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
init()
}
private fun init() {
binding.apply {
rcView.layoutManager = GridLayoutManager(this@MainActivity, 3)
rcView.adapter = adapter
buttonAdd.setOnClickListener {
if(index > 4) index = 0
val plant = Plant(imageIdList[index], "Plant $index")
adapter.addPlant(plant)
index++
}
}
}
}
Plant
data class Plant(val imageId: Int, val title: String)
PlantAdapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.neco_desarrollo.plantshandbook.databinding.PlantItemBinding
import java.util.ArrayList
class PlantAdapter: RecyclerView.Adapter<PlantAdapter.PlantHolder>() {
val plantList = ArrayList<Plant>()
class PlantHolder(item: View): RecyclerView.ViewHolder(item) {
val binding = PlantItemBinding.bind(item)
fun bind(plant: Plant) = with(binding){
im.setImageResource(plant.imageId)
tvTitle.text = plant.title
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PlantHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.plant_item, parent, false)
return PlantHolder(view)
}
override fun onBindViewHolder(holder: PlantHolder, position: Int) {
holder.bind(plantList[position])
}
override fun getItemCount(): Int {
return plantList.size
}
fun addPlant(plant: Plant){
plantList.add(plant)
notifyDataSetChanged()
}
}
themes.xml
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.PlantsHandBook" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/grey</item>
<item name="colorPrimaryVariant">@color/grey</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>
plant_item.xml
<?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="wrap_content">
<androidx.cardview.widget.CardView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:cardCornerRadius="5dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="3dp"
android:orientation="vertical">
<ImageView
android:id="@+id/im"
android:layout_width="match_parent"
android:layout_height="100dp"
app:srcCompat="@drawable/plant1" />
<TextView
android:id="@+id/tvTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:fontFamily="sans-serif-condensed"
android:gravity="center"
android:text="TextView"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>
colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="grey">#8E8E8E</color>
</resources>
build.gradle (Module)
ВНИМАНИЕ!! Заменить applicationId на название вашего пакета!
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "название вашего пакета"
minSdkVersion 19
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures{
viewBinding true
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.5.0'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
У меня ошибка в этой строке rcView.layoutManager лаяут манеджер горит красным. В чём может быть проблема?
У кого с layoutManager проблема, посмотрите чтобы вот здесь вот так было https://prnt.sc/fuRmniMwe8Mv
В видео на 7 мин 44 сек автор даёт идентификатор RecyclerView. Нужно в activity_main.xml в id написать rcView
rcView.layoutManager лаяут манеджер горит красным
у меня приложение просто напросто не запускается на телефоне. как activity создается и уничтожается мгновенно
Так было, когда картинки сунул в drawable24
rcView.layoutManager горит красным и не работает,кто может помочь
“rcView.layoutManager = GridLayoutManager(this@MainActivity, 3)”, “3” добавил?
Спасибо за труды. Еле разобрался как через findViewById это сделать (не имею возможности последнюю версию android studio поставить ТК x32 разрядность системы) поэтому работаю с 3.5.3, и тп
Приходится по вашим урокам учится обходить эти моменты.
Тяжело для понимания начинающему, поэлементно всё понятно, но когда пересматриваю , редактирую код, думаю над каждым переходом , куда что зачем и как , и это кажется очень много времени занимает. А как быстро вам давалось обучение этому?
У кого с layoutManager проблема, посмотрите чтобы вот здесь вот так было https://prnt.sc/fuRmniMwe8Mv
У кого не запускается приложение, проверьте, что при копировании кода изменили название “plantshandbook” приложения на свое в трех местах (MainActivity, PlantAdapter, themes.xml)
работает только первый ряд. при 4 и остальных нажатиях кнопки ничего не происходит – как появились 3 картинки, так и есть
Была похожая проблема, но у меня вылетало приложение, после того как заполнялся первый ряд, я думал, что ошибся в функциях, но так и не смог найти ошибку, посл чего просто поменял значение индекса сразу на 3 (4 картинка -начало 2 ряда) и приложение стало сразу вылетать, удалил это картинку из ресурсов и заработало.
Откуда вы взяли PlantItemBinding ??? Я не понимаю. Как вы импортировали и откуда?????
Что бы это понять вам нужнопосмотреть первые уроки из курса, там я рассказал подробно про ViewBinding
Я понял. Грид надо было пожамкать
Урок интересный. Но больно становиться когда тебе показали функцию (fun addAll()) но не показали ее применения. И что с ней делать и как ее применить одних только слов не достаточно к сожалению. Особенно когда опыта мало или вообще нет. Пройдя уже немалое количество уроков захотелось реализовать свою маленьку идею. Благодаря урокам уровень использования самой среды разработки улучшился, но уровень понимания и написания кода самостоятельно где то еще видимо идет на другой стороне дороги и ни как ни получается сойтись. Это я к тому что вроде бы мысли есть какие то по коду но ни чего ни работает когда ты начинаешь писать. Ни так сложно понять синтаксис или структуру данных, но вот с самой логикой это просто провал полный. Это я про свой случай.
Через месяц обучения у меня такая же ситуация и одной практикой этого не изменишь. Надо читать документацию, литературу по программированию, слушать интервью с разработчиками, тогда из кусков постепенно картинка складывается. Мы сейчас знаем как пользоваться инструментами, но не знаем какие инструменты у нас есть.
Так что делать с этим:
rcView.layoutManager = GridLayoutManager(this@MainActivity, 3)
rcView.adapter = adapter
кто знает то?)
Android resource linking failed
ru.shatohin.plantshandbook.app-mergeDebugResources-30:/layout/plant_item.xml:33: error: ‘@tools:sample/avatars’ is incompatible with attribute src (attr) reference|color.
error: failed linking file resources.