android - 从 API 更改第 20 篇文章的颜色

标签 android json android-studio kotlin

我在这里要做的是更改来自 json 占位符 api https://jsonplaceholder.typicode.com/posts 的前 20 个帖子的颜色. 任何关于如何做到这一点的想法或建议都会很棒。

这是主 Activity

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)

    val retrofit= Retrofit.Builder()
        .baseUrl("https://jsonplaceholder.typicode.com")
        .addConverterFactory(create())
        .build()

    val api = retrofit.create(ApiService:: class.java)

    api.fetchAllPosts().enqueue(object : Callback<List<Post>> {

        override fun onResponse(call: Call<List<Post>>, response: Response<List<Post>>) {
            showData(response.body()!!)
            Log.d("jv", "onResponse")
        }
        override fun onFailure(call: Call<List<Post>>, t: Throwable) {
            Log.d("jv", "onFailure")
        }
    })

}

private fun showData(posts: List<Post>) {
    recyclerView.apply {
        layoutManager = LinearLayoutManager(this@MainActivity)
        adapter = PostsAdapter(posts)
    }

}

这是适配器

class PostsAdapter(private val posts: List<Post>) : RecyclerView.Adapter<PostsAdapter.ViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.post_row, parent, false)
        return ViewHolder(view)
    }

    override fun getItemCount() = posts.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.userId.text= "Userid:" + posts[position].userId.toString()
        holder.id1.text= "id:" + posts[position].id.toString()
        holder.title.text= "Title:" + posts[position].title
        holder.body.text= "Body:" + posts[position].body
    }
    class ViewHolder (itemView:View): RecyclerView.ViewHolder(itemView){

        val userId: TextView = itemView.userid
        val id1: TextView = itemView.id1
        val title: TextView = itemView.title
        val body: TextView = itemView.body
    }
}

这是 post_row 布局

<?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">
    <ImageView
        android:id="@+id/photo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:src="@drawable/ic_check_circle_black_24dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent">
    </ImageView>
    <TextView
        android:id="@+id/id1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="8dp"
        android:textColor="#000"
        android:textSize="32sp"
        app:layout_constraintBottom_toTopOf="@+id/userid"
        app:layout_constraintLeft_toRightOf="@+id/photo"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="1" />
    <TextView
        android:id="@+id/userid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="8dp"
        android:textColor="#000"
        android:textSize="32sp"
        app:layout_constraintBottom_toTopOf="@+id/title"
        app:layout_constraintLeft_toRightOf="@+id/photo"
        app:layout_constraintTop_toBottomOf="@+id/id1"
        tools:text="1" />
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="8dp"
        android:textColor="#000"
        android:textSize="32sp"
        app:layout_constraintBottom_toTopOf="@+id/body"
        app:layout_constraintLeft_toRightOf="@+id/photo"
        app:layout_constraintTop_toBottomOf="@+id/userid"
        tools:text="JV" />
    <TextView
        android:id="@+id/body"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="8dp"
        android:textColor="#000"
        android:textSize="32sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/photo"
        app:layout_constraintTop_toBottomOf="@+id/title"
        tools:text="JV" />
</androidx.constraintlayout.widget.ConstraintLayout>

最佳答案

将 id 添加到您的约束布局

<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:id="@+id/rootLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

定义 2 种颜色:第一种用于 1-20 项,第二种用于其余

 <color name="colorHighlitedPost">...</color>
 <color name="colorNormalPost">...</color>

在 Recycler Adapter 中设置颜色

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.userId.text = "Userid:" + posts[position].userId.toString()
    holder.id1.text = "id:" + posts[position].id.toString()
    holder.title.text = "Title:" + posts[position].title
    holder.body.text = "Body:" + posts[position].body
    val context = holder.rootLayout.context
    if (position < 20) {
        holder.rootLayout.setBackgroundColor(
            ContextCompat.getColor(
                context,
                R.color.colorHighlitedPost
            )
        )
    } else {
        holder.rootLayout.setBackgroundColor(
            ContextCompat.getColor(
                context,
                R.color.colorNormalPost
            )
        )
    }
}

关于android - 从 API 更改第 20 篇文章的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58452258/

相关文章:

android - 任务 'app:prepareDebugAndroidTestDependencies' 执行失败

java - 如何解决 setOnClickListener 的问题

json - 如何在PowerShell中通过json进行迭代而又无法指定值。

Android 报错 String cannot be converted to JSONArray

android - 主源集中的重构不会传播到非 Activity 构建变体

android-studio - flutter 医生找不到android studio

java - 上次 Android 系统更新出现问题(网络 SSID)

android - 使用自定义 ArrayAdapter 将 float 操作按钮添加到 ListFragment

php - android 从 mysql 中检索数据并将其呈现在 recycleview 中并添加事件

Java - 从文件中反序列化整个 json 列表