这是我的第一个应用程序,我很难过。似乎我已经尝试了所有选项,并回答了堆栈溢出的类似问题,但没有结果。
请帮我。
它适用于 XML 预览,但不适用于设备。
物品:
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<variable
name="articleItem"
type="com.example.news.network.ArticleItem" />
</data>
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:cardCornerRadius="8dp"
app:cardElevation="10dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/main_image"
android:layout_width="0dp"
android:layout_height="200dp"
android:scaleType="centerCrop"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:urlToImage="@{articleItem.urlToImage}"
tools:src="@tools:sample/backgrounds/scenic" />
<TextView
android:id="@+id/header_news_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@{articleItem.title}"
android:textColor="#de000000"
android:textSize="15sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/main_image"
tools:text="Header" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
</layout>
带有recyclerview的布局:
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<variable
name="viewModel"
type="com.example.news.viewmodels.OverviewViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.news.MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/news_overview"
android:layout_width="0dp"
android:layout_height="0dp"
android:clipToPadding="false"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:listData="@{viewModel.properties}"
tools:listitem="@layout/news_overview_item"
/>
<ImageView
android:id="@+id/status_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:newsApiStatus="@{viewModel.status}" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
回收站视图:
class NewsOverviewAdapter(private val onClickListener: OnClickListener) :
ListAdapter<ArticleItem, NewsOverviewAdapter.ArticleItemViewHolder>(DiffCallback) {
class ArticleItemViewHolder(private var binding: NewsOverviewItemBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(articleItem: ArticleItem) {
binding.articleItem = articleItem
binding.executePendingBindings()
}
}
companion object DiffCallback : DiffUtil.ItemCallback<ArticleItem>() {
override fun areItemsTheSame(oldItem: ArticleItem, newItem: ArticleItem): Boolean {
return oldItem === newItem
}
override fun areContentsTheSame(oldItem: ArticleItem, newItem: ArticleItem): Boolean {
return oldItem.title == newItem.title
}
}
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): ArticleItemViewHolder {
return ArticleItemViewHolder(NewsOverviewItemBinding.inflate(LayoutInflater.from(parent.context)))
}
override fun onBindViewHolder(holder: ArticleItemViewHolder, position: Int) {
val articleItem = getItem(position)
holder.itemView.setOnClickListener {
onClickListener.onClick(articleItem)
}
holder.bind(articleItem)
}
class OnClickListener(val clickListener: (articleItem: ArticleItem) -> Unit) {
fun onClick(articleItem: ArticleItem) = clickListener(articleItem)
}
}
@BindingAdapter("listData")
fun bindRecyclerView(recyclerView: RecyclerView, data: List<ArticleItem>?){
val adapter=recyclerView.adapter as NewsOverviewAdapter
adapter.submitList(data)
}
@BindingAdapter("urlToImage")
fun bindingImage(imgView: ImageView, imgUrl: String?){
imgUrl?.let{
val imgUri=it.toUri().buildUpon().scheme("https").build()
Glide.with(imgView.context)
.load(imgUri)
.apply(RequestOptions()
.placeholder(R.drawable.loading_animation)
.error(R.drawable.ic_broken_image))
.into(imgView)
}
}
@BindingAdapter("newsApiStatus")
fun bindStatus(statusImageView: ImageView, status: NewsApiStatus?) {
when (status) {
NewsApiStatus.LOADING -> {
statusImageView.visibility = View.VISIBLE
statusImageView.setImageResource(R.drawable.loading_animation)
}
NewsApiStatus.ERROR -> {
statusImageView.visibility = View.VISIBLE
statusImageView.setImageResource(R.drawable.ic_connection_error)
}
NewsApiStatus.DONE -> {
statusImageView.visibility = View.GONE
}
}
}
GitHub 上的完整代码:https ://github.com/MalushkoAA/newnews.git