0

这是我的第一个应用程序,我很难过。似乎我已经尝试了所有选项,并回答了堆栈溢出的类似问题,但没有结果。

请帮我。

它适用于 XML 预览,但不适用于设备。

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

4

0 回答 0