Xml
display a list with a image and a text with xmlunknown
kotlin
2 years ago
4.2 kB
3
Indexable
// XML way to do // layout file for the cell <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/flower_image" android:layout_width="48dp" android:layout_height="48dp" android:layout_margin="8dp" android:contentDescription="@string/flower_image_content_description" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/flower_text" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/flower_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="8dp" android:text="@string/flower1_name" android:textAppearance="?attr/textAppearanceHeadline5" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="@+id/flower_image" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> // layout file for the screen <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" app:layoutManager="LinearLayoutManager"/> </androidx.constraintlayout.widget.ConstraintLayout> // Adapter class FlowersAdapter(private val onClick: (Flower) -> Unit) : ListAdapter<Flower, FlowersAdapter.FlowerViewHolder>(FlowerDiffCallback) { /* ViewHolder for Flower, takes in the inflated view and the onClick behavior. */ class FlowerViewHolder(itemView: View, val onClick: (Flower) -> Unit) : RecyclerView.ViewHolder(itemView) { private val flowerTextView: TextView = itemView.findViewById(R.id.flower_text) private val flowerImageView: ImageView = itemView.findViewById(R.id.flower_image) private var currentFlower: Flower? = null init { itemView.setOnClickListener { currentFlower?.let { onClick(it) } } } /* Bind flower name and image. */ fun bind(flower: Flower) { currentFlower = flower flowerTextView.text = flower.name if (flower.image != null) { flowerImageView.setImageResource(flower.image) } else { flowerImageView.setImageResource(R.drawable.rose) } } } /* Creates and inflates view and return FlowerViewHolder. */ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FlowerViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.flower_item, parent, false) return FlowerViewHolder(view, onClick) } /* Gets current flower and uses it to bind view. */ override fun onBindViewHolder(holder: FlowerViewHolder, position: Int) { val flower = getItem(position) holder.bind(flower) } } object FlowerDiffCallback : DiffUtil.ItemCallback<Flower>() { override fun areItemsTheSame(oldItem: Flower, newItem: Flower): Boolean { return oldItem == newItem } override fun areContentsTheSame(oldItem: Flower, newItem: Flower): Boolean { return oldItem.id == newItem.id } } // usage in the screen class FlowersListActivity : AppCompatActivity() { // ... override fun onCreate(savedInstanceState: Bundle?) { // ... setContentView(R.layout.activity_main) // ... val flowersAdapter = FlowersAdapter { /* do something */ } val recyclerView: RecyclerView = findViewById(R.id.recycler_view) recyclerView.adapter = flowersAdapter // ... } // .. }
Editor is loading...