如何在 Kotlin recycleview 适配器中更改可见性和文本颜色

如何解决如何在 Kotlin recycleview 适配器中更改可见性和文本颜色

可见性和文本颜色在片段和活动中很容易改变,但是当我在活动中使用相同的代码时,没有任何反应。那么,如何以编程方式更改 Kotlin 适配器中的可见性和文本颜色?我是否在 onBindViewHolder 或 MyViewHolder 中进行了这些更改。 注意:去年我能够在 Java 适配器中执行此操作。

这是代码。期待您的回音。

你们都在外面保持安全。


recycler_list_layout.xml

    <LinearLayout 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"
    android:layout_alignParentEnd="true"
    android:orientation="vertical"
    android:paddingTop="10dp">

    <LinearLayout
        android:id="@+id/visible_full_row"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/date"
            android:layout_width="55dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/weight"
            android:layout_width="45dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/hours"
            android:layout_width="20dp"
            android:layout_height="wrap_content"
            android:gravity="end"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/minutes"
            android:layout_width="28dp"
            android:layout_height="19dp"
            android:gravity="start"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp"
            app:drawableStartCompat="@drawable/colon" />

        <TextView
            android:id="@+id/bg"
            android:layout_width="40dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/systolic"
            android:layout_width="27dp"
            android:layout_height="wrap_content"
            android:gravity="end"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/diastolic"
            android:layout_width="35dp"
            android:layout_height="19dp"
            android:gravity="start"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp"
            app:drawableLeftCompat="@drawable/slash"
            app:drawableStartCompat="@drawable/slash" />

        <TextView
            android:id="@+id/item_med1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

                <TextView
            android:id="@+id/item_med2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/item_med3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/item_med4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/item_med5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/item_med6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/item_med7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/item_med8"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/item_med9"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/item_med10"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:maxLines="1"
            android:textColor="@color/colorBlack"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/comment"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:paddingStart="8dp"
            android:textColor="@android:color/black"
            android:textSize="14sp" />
    </LinearLayout>
</LinearLayout> 

...

...

class listadapter: RecyclerView.Adapter<MyViewHolder>() {

private var userlist = emptyList<User>()

 override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): MyViewHolder {
     return MyViewHolder(LayoutInflater.from(parent.context)
         .inflate(R.layout.recycler_list_layout,parent,false)
     )
 }

 override fun getItemCount(): Int {
     return userlist.size}

 override fun onBindViewHolder(holder: MyViewHolder,position: Int) {

     val currentItem = userlist[position]

currentItem.id.toString()
     holder.itemView.findViewById<TextView>(R.id.date).text = currentItem.date_tv
     holder.itemView.findViewById<TextView>(R.id.weight).text = currentItem.weight_tv
     holder.itemView.findViewById<TextView>(R.id.hours).text = currentItem.hour_tv
         //INVISIBLE minutes_tv when empty
     holder.itemView.findViewById<TextView>(R.id.minutes).text = 
currentItem.minutes_tv
         //red text color when bg is over 120
     holder.itemView.findViewById<TextView>(R.id.bg).text = currentItem.bg_tv
         //red text color when systolic is over 120
     holder.itemView.findViewById<TextView>(R.id.systolic).text = 
 currentItem.systolic_tv
         //red text color when diastolic is over 80
         //INVISIBLE diastolic_tv when empty
     holder.itemView.findViewById<TextView>(R.id.diastolic).text = 
currentItem.diastolic_tv
         //GONE when med1 is empty
     holder.itemView.findViewById<TextView>(R.id.item_med1).text = currentItem.med1_tv
         //GONE when med2 is empty
     holder.itemView.findViewById<TextView>(R.id.item_med2).text = currentItem.med2_tv
         //GONE when med3 is empty
     holder.itemView.findViewById<TextView>(R.id.item_med3).text = currentItem.med3_tv
         //GONE when med4 is empty
     holder.itemView.findViewById<TextView>(R.id.item_med4).text = currentItem.med4_tv
         //GONE when med5 is empty
     holder.itemView.findViewById<TextView>(R.id.item_med5).text = currentItem.med5_tv
         //GONE when med6 is empty
     holder.itemView.findViewById<TextView>(R.id.item_med6).text = currentItem.med6_tv
         //GONE when med7 is empty
     holder.itemView.findViewById<TextView>(R.id.item_med7).text = currentItem.med7_tv
         //GONE when med8 is empty
     holder.itemView.findViewById<TextView>(R.id.item_med8).text = currentItem.med8_tv
         //GONE when med9 is empty
     holder.itemView.findViewById<TextView>(R.id.item_med9).text = currentItem.med9_tv
        //GONE when med10 is empty
     holder.itemView.findViewById<TextView>(R.id.item_med10).text = 
currentItem.med10_tv
     holder.itemView.findViewById<TextView>(R.id.comment).text = 
currentItem.comment_tv

     //not working,change text color
     //NullPointerException
//       bg_tv!!.setTextColor(Color.parseColor("#F61505"))
//       holder.bg_tv.setTextColor(ContextCompat.getColor(context!!,R.color.colorAccent))
//       bg_tv.setTextColor(ContextCompat.getColor(context!!,R.color.colorAccent))
//
//       //not working
//       med1_tv.visibility = View.GONE
//       med1_tv.isVisible = false
//       holder.itemView.visibility = View.GONE
//       holder.item_med1!!.visibility = View.GONE

     holder.itemView.findViewById<LinearLayout>(R.id.visible_full_row).setonClickListener {
//             val context: Context = holder.itemView.context

         val action = HomeFragmentDirections.homeFragmentToEditFragment(currentItem)
         holder.itemView.findNavController().navigate(action)
     }
 }

 fun setData(user: List<User>){
     this.userlist = user
     notifyDataSetChanged()
 }
} 

...

...

open class MyViewHolder (itemView: View): RecyclerView.ViewHolder(itemView){

var date: TextView? = null
var weight: TextView? = null
var hours: TextView? = null
var minutes: TextView? = null
var bg: TextView? = null
var systolic: TextView? = null
var diastolic: TextView? = null
var item_med1: TextView? = null
var item_med2: TextView? = null
var item_med3: TextView? = null
var item_med4: TextView? = null
var item_med5: TextView? = null
var item_med6: TextView? = null
var item_med7: TextView? = null
var item_med8: TextView? = null
var item_med9: TextView? = null
var item_med10: TextView? = null
var comment: TextView? = null

fun MyViewHolder(itemView: View) {

    date = itemView.findViewById<View>(R.id.date) as TextView //recycler_list_layout
    weight = itemView.findViewById<View>(R.id.weight) as TextView
    hours = itemView.findViewById<View>(R.id.hours) as TextView
    minutes = itemView.findViewById<View>(R.id.minutes) as TextView
    bg = itemView.findViewById<View>(R.id.bg) as TextView
    systolic = itemView.findViewById<View>(R.id.systolic) as TextView
    diastolic = itemView.findViewById<View>(R.id.diastolic) as TextView
    item_med1 = itemView.findViewById<View>(R.id.item_med1) as TextView
    item_med2 = itemView.findViewById<View>(R.id.item_med2) as TextView
    item_med3 = itemView.findViewById<View>(R.id.item_med3) as TextView
    item_med4 = itemView.findViewById<View>(R.id.item_med4) as TextView
    item_med5 = itemView.findViewById<View>(R.id.item_med5) as TextView
    item_med6 = itemView.findViewById<View>(R.id.item_med6) as TextView
    item_med7 = itemView.findViewById<View>(R.id.item_med7) as TextView
    item_med8 = itemView.findViewById<View>(R.id.item_med8) as TextView
    item_med9 = itemView.findViewById<View>(R.id.item_med9) as TextView
    item_med10 =itemView.findViewById<View>(R.id.item_med10) as TextView
    comment = itemView.findViewById<View>(R.id.comment) as TextView

//        Why is it this code works in fragments and activities,yet fails in adapters?
//        Why is it this code worked in java adapters,but not kotlin?

//        //not working
//        if (item_med1!!.text.isNotEmpty()) {item_med1!!.visibility = View.VISIBLE}
//        if (item_med2!!.text.isNotEmpty()) {item_med2!!.visibility = View.VISIBLE}
//        if (item_med3!!.text.isNotEmpty()) {item_med2!!.visibility = View.VISIBLE}
//        if (item_med4!!.text.isNotEmpty()) {item_med2!!.visibility = View.VISIBLE}
//        if (item_med5!!.text.isNotEmpty()) {item_med2!!.visibility = View.VISIBLE}
//        if (item_med6!!.text.isNotEmpty()) {item_med2!!.visibility = View.VISIBLE}
//        if (item_med7!!.text.isNotEmpty()) {item_med2!!.visibility = View.VISIBLE}
//        if (item_med8!!.text.isNotEmpty()) {item_med2!!.visibility = View.VISIBLE}
//        if (item_med9!!.text.isNotEmpty()) {item_med2!!.visibility = View.VISIBLE}
//        if (item_med10!!.text.isNotEmpty()) {item_med10!!.visibility = View.VISIBLE}

//        //not working
//        item_med1!!.visibility = View.GONE
//        item_med1!!.isVisible = false

//         //not working,change text color
//         //NullPointerException
//         bg!!.setTextColor(Color.parseColor("#F61505"))
//         bg.setTextColor(ContextCompat.getColor(context!!,R.color.colorAccent))
//
}
}

...

...

class HomeFragment : Fragment(){

private val myPreference = "myPref"

private val MED1_KEY = "KEY_MED1"
private val MED2_KEY = "KEY_MED2"
private val MED3_KEY = "KEY_MED3"
private val MED4_KEY = "KEY_MED4"
private val MED5_KEY = "KEY_MED5"
private val MED6_KEY = "KEY_MED6"
private val MED7_KEY = "KEY_MED7"
private val MED8_KEY = "KEY_MED8"
private val MED9_KEY = "KEY_MED9"
private val MED10_KEY = "KEY_MED10"

private lateinit var sharedPreferences: SharedPreferences

private lateinit var addfloat: FloatingActionButton
private lateinit var Recycler: RecyclerView

private lateinit var homeviewmodel: Homeviewmodel
private var _binding: FragmentHomeBinding? = null

// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?,): View? {

    homeviewmodel =
        viewmodelProvider(this).get(Homeviewmodel::class.java)

    val root = inflater.inflate(R.layout.fragment_home,container,false)

    val context = activity?.applicationContext

    addfloat = root.findViewById(R.id.fab)
    Recycler = root.findViewById(R.id.product_list)

    val adapter = listadapter()
    Recycler.adapter = adapter
    Recycler.layoutManager = linearlayoutmanager(context)
    homeviewmodel.readAllData.observe(viewLifecycleOwner,{ user ->
            adapter.setData(user)
        })

    addfloat.setonClickListener { view ->
        findNavController().navigate(R.id.homeFragment_to_addFragment)
    }

//        //working,changed text color
//        headerTV_med1.setTextColor(ContextCompat.getColor(requireContext(),R.color.colorAccent))

    //wrapcontent
    val headerTV_med1 = root.findViewById(R.id.headerTV_med1) as TextView
    val headerTV_med2 = root.findViewById(R.id.headerTV_med2) as TextView
    val headerTV_med3 = root.findViewById(R.id.headerTV_med3) as TextView
    val headerTV_med4 = root.findViewById(R.id.headerTV_med4) as TextView
    val headerTV_med5 = root.findViewById(R.id.headerTV_med5) as TextView
    val headerTV_med6 = root.findViewById(R.id.headerTV_med6) as TextView
    val headerTV_med7 = root.findViewById(R.id.headerTV_med7) as TextView
    val headerTV_med8 = root.findViewById(R.id.headerTV_med8) as TextView
    val headerTV_med9 = root.findViewById(R.id.headerTV_med9) as TextView
    val headerTV_med10 = root.findViewById(R.id.headerTV_med10) as TextView

    //50dp
    val headerTV_med1a = root.findViewById(R.id.headerTV_med1a) as TextView
    val headerTV_med2a = root.findViewById(R.id.headerTV_med2a) as TextView
    val headerTV_med3a = root.findViewById(R.id.headerTV_med3a) as TextView
    val headerTV_med4a = root.findViewById(R.id.headerTV_med4a) as TextView
    val headerTV_med5a = root.findViewById(R.id.headerTV_med5a) as TextView
    val headerTV_med6a = root.findViewById(R.id.headerTV_med6a) as TextView
    val headerTV_med7a = root.findViewById(R.id.headerTV_med7a) as TextView
    val headerTV_med8a = root.findViewById(R.id.headerTV_med8a) as TextView
    val headerTV_med9a = root.findViewById(R.id.headerTV_med9a) as TextView
    val headerTV_med10a = root.findViewById(R.id.headerTV_med10a) as TextView

    sharedPreferences =
        requireActivity().getSharedPreferences(myPreference,Context.MODE_PRIVATE)

    //wrapcontente
    headerTV_med1.setText(sharedPreferences.getString(MED1_KEY,""))
    headerTV_med2.setText(sharedPreferences.getString(MED2_KEY,""))
    headerTV_med3.setText(sharedPreferences.getString(MED3_KEY,""))
    headerTV_med4.setText(sharedPreferences.getString(MED4_KEY,""))
    headerTV_med5.setText(sharedPreferences.getString(MED5_KEY,""))
    headerTV_med6.setText(sharedPreferences.getString(MED6_KEY,""))
    headerTV_med7.setText(sharedPreferences.getString(MED7_KEY,""))
    headerTV_med8.setText(sharedPreferences.getString(MED8_KEY,""))
    headerTV_med9.setText(sharedPreferences.getString(MED9_KEY,""))
    headerTV_med10.setText(sharedPreferences.getString(MED10_KEY,""))

    //50dp
    headerTV_med1a.setText(sharedPreferences.getString(MED1_KEY,""))
    headerTV_med2a.setText(sharedPreferences.getString(MED2_KEY,""))
    headerTV_med3a.setText(sharedPreferences.getString(MED3_KEY,""))
    headerTV_med4a.setText(sharedPreferences.getString(MED4_KEY,""))
    headerTV_med5a.setText(sharedPreferences.getString(MED5_KEY,""))
    headerTV_med6a.setText(sharedPreferences.getString(MED6_KEY,""))
    headerTV_med7a.setText(sharedPreferences.getString(MED7_KEY,""))
    headerTV_med8a.setText(sharedPreferences.getString(MED8_KEY,""))
    headerTV_med9a.setText(sharedPreferences.getString(MED9_KEY,""))
    headerTV_med10a.setText(sharedPreferences.getString(MED10_KEY,""))

    //this works in fragment,not in adapter
    if (headerTV_med1.text.isNotEmpty()) {headerTV_med1.visibility = View.VISIBLE}
    if (headerTV_med2.text.isNotEmpty()) {headerTV_med2.visibility = View.VISIBLE}
    if (headerTV_med3.text.isNotEmpty()) {headerTV_med3.visibility = View.VISIBLE}
    if (headerTV_med4.text.isNotEmpty()) {headerTV_med4.visibility = View.VISIBLE}
    if (headerTV_med5.text.isNotEmpty()) {headerTV_med5.visibility = View.VISIBLE}
    if (headerTV_med6.text.isNotEmpty()) {headerTV_med6.visibility = View.VISIBLE}
    if (headerTV_med7.text.isNotEmpty()) {headerTV_med7.visibility = View.VISIBLE}
    if (headerTV_med8.text.isNotEmpty()) {headerTV_med8.visibility = View.VISIBLE}
    if (headerTV_med9.text.isNotEmpty()) {headerTV_med9.visibility = View.VISIBLE}
    if (headerTV_med10.text.isNotEmpty()) {headerTV_med10.visibility = View.VISIBLE}

    //meds will be truncated in 50dp TextViews
    //onClickListener will GONE the 50dp TextViews and VISIBLE the wrapcontent TextViews
    //onFocusListener might work better
    headerTV_med1.setonClickListener {
        headerTV_med1.visibility = View.GONE
        headerTV_med1a.visibility = View.VISIBLE}
    headerTV_med1a.setonClickListener {
        headerTV_med1a.visibility = View.GONE
        headerTV_med1.visibility = View.VISIBLE}

    headerTV_med2.setonClickListener {
        headerTV_med2.visibility = View.GONE
        headerTV_med2a.visibility = View.VISIBLE}
    headerTV_med2a.setonClickListener {
        headerTV_med2a.visibility = View.GONE
        headerTV_med2.visibility = View.VISIBLE}

    headerTV_med3.setonClickListener {
        headerTV_med3.visibility = View.GONE
        headerTV_med3a.visibility = View.VISIBLE}
    headerTV_med3a.setonClickListener {
        headerTV_med3a.visibility = View.GONE
        headerTV_med3.visibility = View.VISIBLE}

    headerTV_med4.setonClickListener {
        headerTV_med4.visibility = View.GONE
        headerTV_med4a.visibility = View.VISIBLE}
    headerTV_med4a.setonClickListener {
        headerTV_med4a.visibility = View.GONE
        headerTV_med4.visibility = View.VISIBLE}

    headerTV_med5.setonClickListener {
        headerTV_med5.visibility = View.GONE
        headerTV_med5a.visibility = View.VISIBLE}
    headerTV_med5a.setonClickListener {
        headerTV_med5a.visibility = View.GONE
        headerTV_med5.visibility = View.VISIBLE}

    headerTV_med6.setonClickListener {
        headerTV_med6.visibility = View.GONE
        headerTV_med6a.visibility = View.VISIBLE}
    headerTV_med6a.setonClickListener {
        headerTV_med6a.visibility = View.GONE
        headerTV_med6.visibility = View.VISIBLE}

    headerTV_med7.setonClickListener {
        headerTV_med7.visibility = View.GONE
        headerTV_med7a.visibility = View.VISIBLE}
    headerTV_med7a.setonClickListener {
        headerTV_med7a.visibility = View.GONE
        headerTV_med7.visibility = View.VISIBLE}

    headerTV_med8.setonClickListener {
        headerTV_med8.visibility = View.GONE
        headerTV_med8a.visibility = View.VISIBLE}
    headerTV_med8a.setonClickListener {
        headerTV_med8a.visibility = View.GONE
        headerTV_med8.visibility = View.VISIBLE}

    headerTV_med9.setonClickListener {
        headerTV_med9.visibility = View.GONE
        headerTV_med9a.visibility = View.VISIBLE}
    headerTV_med9a.setonClickListener {
        headerTV_med9a.visibility = View.GONE
        headerTV_med9.visibility = View.VISIBLE}

    headerTV_med10.setonClickListener {
        headerTV_med10.visibility = View.GONE
        headerTV_med10a.visibility = View.VISIBLE}
    headerTV_med10a.setonClickListener {
        headerTV_med10a.visibility = View.GONE
        headerTV_med10.visibility = View.VISIBLE}

    return root
}
}

...

...

class Homeviewmodel (application: Application): Androidviewmodel(application) {
val readAllData: LiveData<List<User>>
private val repository: UserRepository
init {
    val userDao = UserDatabase.getDatabase(application).userDao()
    repository = UserRepository(userDao)
    readAllData = repository.readAllData
}

fun addUser(user: User){
    viewmodelScope.launch(dispatchers.IO){
        repository.addUser(user)
    }
}

fun upDateData(user: User){
    viewmodelScope.launch {
        repository.upDateData(user)
    }
}

fun deleteData(user: User){
    viewmodelScope.launch {
        repository.deleteData(user)
    }
}
}

解决方法

最终通过实现数据绑定使代码工作。

推荐以下代码实验室,帮助您开始使用 Room、recyclerview 和数据绑定。

代码实验室

TrackMySleepQuality
   6.1,6.2,and 6.3
RecyclerView
   7.1,7.2 up to Task 6,Step 3: Replace findViewById()

无法通过 7.2,任务 6,步骤 3:在不破坏项目的情况下替换 findViewById()。

这是新代码。

适配器

   package com.example.kotlindrawer.adapters
   
   import android.graphics.Color
   import android.view.LayoutInflater
   import android.view.View
   import android.view.ViewGroup
   import android.widget.LinearLayout
   import android.widget.TextView
   import androidx.navigation.findNavController
   import androidx.recyclerview.widget.DiffUtil
   import androidx.recyclerview.widget.ListAdapter
   import androidx.recyclerview.widget.RecyclerView
   import com.example.kotlindrawer.R
   import com.example.kotlindrawer.models.User
   import com.example.kotlindrawer.ui.home.HomeFragmentDirections
   
   class UserAdapter : ListAdapter<User,UserAdapter.ViewHolder>(UserDiffCallback())                      {//7.2.2
       override fun onBindViewHolder( holder: ViewHolder,position: Int) {//7.1.2
           val item = getItem(position)//7.2.2
           bind(holder,item)//7.1.2
       }

       private fun bind( holder: ViewHolder,item: User) {
   
           //needed to display data//7.2.2
           holder.adapterdate.text = item.date_tv.toString()
           holder.adapterweight.text = item.weight_tv.toString()
           holder.adapterhours.text = item.hour_tv.toString()
           holder.adaptercolon.text = item.colon_tv.toString()
           holder.adapterminutes.text = item.minutes_tv.toString()
           holder.adapterbg.text = item.bg_tv.toString()
           holder.adaptersystolic.text = item.systolic_tv.toString()
           holder.adapterslash.text = item.slash_tv.toString()
           holder.adapterdiastolic.text = item.diastolic_tv.toString()
           holder.adaptermed1.text = item.med1_tv.toString()
           holder.adaptermed2.text = item.med2_tv.toString()
           holder.adaptermed3.text = item.med3_tv.toString()
           holder.adaptermed4.text = item.med4_tv.toString()
           holder.adaptermed5.text = item.med5_tv.toString()
           holder.adaptermed6.text = item.med6_tv.toString()
           holder.adaptermed7.text = item.med7_tv.toString()
           holder.adaptermed8.text = item.med8_tv.toString()
           holder.adaptermed9.text = item.med9_tv.toString()
           holder.adaptermed10.text = item.med10_tv.toString()
           holder.adaptercomment.text = item.comment_tv.toString()
   
   //the following code did not work until databinding
   
           //this code will print values red when
           // blood glucose,systolic and diastolic are high
           try {
               val b: Int = holder.adapterbg.getText().toString().toInt()
               if (b > 120) {holder.adapterbg.setTextColor(Color.RED)
               }
           } catch (nfe: NumberFormatException) {
               println("Could not parse $nfe")
           }
   
           try {
               val b: Int = holder.adaptersystolic.getText().toString().toInt()
               if (b > 120) {holder.adaptersystolic.setTextColor(Color.RED)
               }
           } catch (nfe: NumberFormatException) {
               println("Could not parse $nfe")
           }
   
           try {
               val b: Int = holder.adapterdiastolic.getText().toString().toInt()
               if (b > 80) {holder.adapterdiastolic.setTextColor(Color.RED)
               }
           } catch (nfe: NumberFormatException) {
               println("Could not parse $nfe")
           }
   
           //this invisibles colon and slash TextViews when values are blank
           if (holder.adapterminutes.text.isBlank()) {holder.adaptercolon.visibility = View.INVISIBLE}
           if (holder.adapterdiastolic.text.isBlank()) {holder.adapterslash.visibility = View.INVISIBLE}
   
           //this gones empty medication TextViews
           if (holder.adaptermed1.text.isBlank()) {holder.adaptermed1.visibility = View.GONE}
           if (holder.adaptermed2.text.isBlank()) {holder.adaptermed2.visibility = View.GONE}
           if (holder.adaptermed3.text.isBlank()) {holder.adaptermed3.visibility = View.GONE}
           if (holder.adaptermed4.text.isBlank()) {holder.adaptermed4.visibility = View.GONE}
           if (holder.adaptermed5.text.isBlank()) {holder.adaptermed5.visibility = View.GONE}
           if (holder.adaptermed6.text.isBlank()) {holder.adaptermed6.visibility = View.GONE}
           if (holder.adaptermed7.text.isBlank()) {holder.adaptermed7.visibility = View.GONE}
           if (holder.adaptermed8.text.isBlank()) {holder.adaptermed8.visibility = View.GONE}
           if (holder.adaptermed9.text.isBlank()) {holder.adaptermed9.visibility = View.GONE}
           if (holder.adaptermed10.text.isBlank()) {holder.adaptermed10.visibility = View.GONE}
   
           holder.itemView.findViewById<LinearLayout>(R.id.visible_full_row)
        .setOnClickListener {
               val action = HomeFragmentDirections.homeFragmentToEditFragment(item)
               holder.itemView.findNavController().navigate(action)
           }
       }
   
       override fun onCreateViewHolder(
           parent: ViewGroup,viewType: Int): ViewHolder {//7.1.2
           return ViewHolder.from(parent)
       }
   
       class ViewHolder private constructor(
           itemView: View) : RecyclerView.ViewHolder(itemView){
   
           //needed for fun bind
           //how to get rid of this
           val adapterdate: TextView = itemView.findViewById(R.id.item_date)
           val adapterweight: TextView = itemView.findViewById(R.id.item_weight)
           val adapterhours: TextView = itemView.findViewById(R.id.item_hours)
           val adaptercolon: TextView = itemView.findViewById(R.id.item_colon)
           val adapterminutes: TextView = itemView.findViewById(R.id.item_minutes)
           val adapterbg: TextView = itemView.findViewById(R.id.item_bg)
           val adaptersystolic: TextView = itemView.findViewById(R.id.item_systolic)
           val adapterslash: TextView = itemView.findViewById(R.id.item_slash)
           val adapterdiastolic: TextView = itemView.findViewById(R.id.item_diastolic)
           val adaptermed1: TextView = itemView.findViewById(R.id.item_med1)
           val adaptermed2: TextView = itemView.findViewById(R.id.item_med2)
           val adaptermed3: TextView = itemView.findViewById(R.id.item_med3)
           val adaptermed4: TextView = itemView.findViewById(R.id.item_med4)
           val adaptermed5: TextView = itemView.findViewById(R.id.item_med5)
           val adaptermed6: TextView = itemView.findViewById(R.id.item_med6)
           val aaptermed7: TextView = itemView.findViewById(R.id.item_med7)
           val adaptermed8: TextView = itemView.findViewById(R.id.item_med8)
           val adaptermed9: TextView = itemView.findViewById(R.id.item_med9)
           val adaptermed10: TextView = itemView.findViewById(R.id.item_med10)
           val adaptercomment: TextView = itemView.findViewById(R.id.item_comment)
   
           fun bind(item: User){ }
   
           companion object {
               fun from(parent: ViewGroup): ViewHolder {
                   val layoutInflater = LayoutInflater
                       .from(parent.context)
   
                   val view = layoutInflater
                       .inflate(R.layout.recycler_list_layout,parent,false)//7.1.2
   
                   return ViewHolder(view)
               }
           }
       }
   }
   
   class UserDiffCallback : DiffUtil.ItemCallback<User>() {//7.2.1
       override fun areContentsTheSame(
           oldItem: User,newItem: User): Boolean {//7.2.1
           return oldItem == newItem//7.2.1
       }//7.2.1
   
       override fun areItemsTheSame(
           oldItem: User,newItem: User): Boolean {//7.2.1
           return oldItem.stat_id == newItem.stat_id//7.2.1
       }//7.2.1
   }//7.2.1

...

首页片段

...

   package com.example.kotlindrawer.ui.home
   
   //TODO try onFocusListener,replace onClickListener
   //TODO replace sharedpreferences with datastore
   //TODO try binding to share data from Medications fragment
   
   import android.content.Context
   import android.content.SharedPreferences
   import android.os.Bundle
   import android.view.LayoutInflater
   import android.view.View
   import android.view.ViewGroup
   import android.widget.TextView
   import androidx.databinding.DataBindingUtil
   import androidx.fragment.app.Fragment
   import androidx.lifecycle.Observer
   import androidx.lifecycle.ViewModelProvider
   import androidx.navigation.fragment.findNavController
   import com.example.kotlindrawer.R
   import com.example.kotlindrawer.Room.UserDatabase
   import com.example.kotlindrawer.adapters.UserAdapter
   import com.example.kotlindrawer.databinding.FragmentHomeBinding
   import com.google.android.material.floatingactionbutton.FloatingActionButton
   
   class HomeFragment : Fragment(){
   
       private val myPreference = "myPref"
   
       private val MED1_KEY = "KEY_MED1"
       private val MED2_KEY = "KEY_MED2"
       private val MED3_KEY = "KEY_MED3"
       private val MED4_KEY = "KEY_MED4"
       private val MED5_KEY = "KEY_MED5"
       private val MED6_KEY = "KEY_MED6"
       private val MED7_KEY = "KEY_MED7"
       private val MED8_KEY = "KEY_MED8"
       private val MED9_KEY = "KEY_MED9"
       private val MED10_KEY = "KEY_MED10"
   
       private lateinit var sharedPreferences: SharedPreferences
   
       private lateinit var addfloat: FloatingActionButton
   
       // This property is only valid between onCreateView and
       // onDestroyView.
   
       override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?,): View? {
   
           // Get a reference to the binding object and inflate the fragment        views.//SleepTracker
           val binding: FragmentHomeBinding = DataBindingUtil.inflate(//SleepTracker
               inflater,R.layout.fragment_home,container,false)//SleepTracker
   
           val application = requireNotNull(this.activity).application//SleepTracker
   
           val dataSource = UserDatabase.getInstance(application).userDao()//SleepTracker
   
           val viewModelFactory = HomeViewModelFactory(dataSource,application)//SleepTracker
   
           val homeViewModel = ViewModelProvider(this,viewModelFactory)//5.3
               .get(HomeViewModel::class.java)//5.3
   
           binding.homeViewModel = homeViewModel//5.3
   
           binding.lifecycleOwner = viewLifecycleOwner//5.3
   
           val adapter = UserAdapter()//7.1
           binding.productList.adapter = adapter//7.1
   
           val nights = dataSource.getAllNights()//7.1
   
           homeViewModel.nights.observe(viewLifecycleOwner,Observer {//7.1.1
               it?.let {//7.1.1
                   adapter.submitList(it)//7.2.2
               }//7.1.1
           })//7.1.1
   
           val root: View = binding.root
   
           addfloat = root.findViewById(R.id.fab)
           addfloat.setOnClickListener {
               findNavController().navigate(R.id.homeFragment_to_addFragment)
           }
   
           //wrapcontent
           val headerTV_med1 = root.findViewById(R.id.headerTV_med1) as TextView
           val headerTV_med2 = root.findViewById(R.id.headerTV_med2) as TextView
           val headerTV_med3 = root.findViewById(R.id.headerTV_med3) as TextView
           val headerTV_med4 = root.findViewById(R.id.headerTV_med4) as TextView
           val headerTV_med5 = root.findViewById(R.id.headerTV_med5) as TextView
           val headerTV_med6 = root.findViewById(R.id.headerTV_med6) as TextView
           val headerTV_med7 = root.findViewById(R.id.headerTV_med7) as TextView
           val headerTV_med8 = root.findViewById(R.id.headerTV_med8) as TextView
           val headerTV_med9 = root.findViewById(R.id.headerTV_med9) as TextView
           val headerTV_med10 = root.findViewById(R.id.headerTV_med10) as TextView
   
           //50dp
           val headerTV_med1a = root.findViewById(R.id.headerTV_med1a) as TextView
           val headerTV_med2a = root.findViewById(R.id.headerTV_med2a) as TextView
           val headerTV_med3a = root.findViewById(R.id.headerTV_med3a) as TextView
           val headerTV_med4a = root.findViewById(R.id.headerTV_med4a) as TextView
           val headerTV_med5a = root.findViewById(R.id.headerTV_med5a) as TextView
           val headerTV_med6a = root.findViewById(R.id.headerTV_med6a) as TextView
           val headerTV_med7a = root.findViewById(R.id.headerTV_med7a) as TextView
           val headerTV_med8a = root.findViewById(R.id.headerTV_med8a) as TextView
           val headerTV_med9a = root.findViewById(R.id.headerTV_med9a) as TextView
           val headerTV_med10a = root.findViewById(R.id.headerTV_med10a) as TextView
   
           sharedPreferences =
               requireActivity().getSharedPreferences(myPreference,Context.MODE_PRIVATE)

           //VISIBLEs TextViews with content
           if (haderTV_med1.text.isNotEmpty()) {headerTV_med1.visibility = View.VISIBLE}
           if (headerTV_med2.text.isNotEmpty()) {headerTV_med2.visibility = View.VISIBLE}
           if (headerTV_med3.text.isNotEmpty()) {headerTV_med3.visibility = View.VISIBLE}
           if (headerTV_med4.text.isNotEmpty()) {headerTV_med4.visibility = View.VISIBLE}
           if (headerTV_med5.text.isNotEmpty()) {headerTV_med5.visibility = View.VISIBLE}
           if (headerTV_med6.text.isNotEmpty()) {headerTV_med6.visibility = View.VISIBLE}
           if (headerTV_med7.text.isNotEmpty()) {headerTV_med7.visibility = View.VISIBLE}
           if (headerTV_med8.text.isNotEmpty()) {headerTV_med8.visibility = View.VISIBLE}
           if (headerTV_med9.text.isNotEmpty()) {headerTV_med9.visibility = View.VISIBLE}
           if (headerTV_med10.text.isNotEmpty()) {headerTV_med10.visibility = View.VISIBLE}

           //wrapcontents
           headerTV_med1.setText(sharedPreferences.getString(MED1_KEY,""))
           headerTV_med2.setText(sharedPreferences.getString(MED2_KEY,""))
           headerTV_med3.setText(sharedPreferences.getString(MED3_KEY,""))
           headerTV_med4.setText(sharedPreferences.getString(MED4_KEY,""))
           headerTV_med5.setText(sharedPreferences.getString(MED5_KEY,""))
           headerTV_med6.setText(sharedPreferences.getString(MED6_KEY,""))
           headerTV_med7.setText(sharedPreferences.getString(MED7_KEY,""))
           headerTV_med8.setText(sharedPreferences.getString(MED8_KEY,""))
           headerTV_med9.setText(sharedPreferences.getString(MED9_KEY,""))
           headerTV_med10.setText(sharedPreferences.getString(MED10_KEY,""))
   
           //50dp
           headerTV_med1a.setText(sharedPreferences.getString(MED1_KEY,""))
           headerTV_med2a.setText(sharedPreferences.getString(MED2_KEY,""))
           headerTV_med3a.setText(sharedPreferences.getString(MED3_KEY,""))
           headerTV_med4a.setText(sharedPreferences.getString(MED4_KEY,""))
           headerTV_med5a.setText(sharedPreferences.getString(MED5_KEY,""))
           headerTV_med6a.setText(sharedPreferences.getString(MED6_KEY,""))
           headerTV_med7a.setText(sharedPreferences.getString(MED7_KEY,""))
           headerTV_med8a.setText(sharedPreferences.getString(MED8_KEY,""))
           headerTV_med9a.setText(sharedPreferences.getString(MED9_KEY,""))
           headerTV_med10a.setText(sharedPreferences.getString(MED10_KEY,""))
   
           //meds will be truncated in 50dp TextViews
           //onClickListener will GONE the 50dp TextViews and VISIBLE the wrapcontent TextViews
           //onFocusListener might work better
           headerTV_med1.setOnClickListener {
           headerTV_med1.visibility = View.GONE
           headerTV_med1a.visibility = View.VISIBLE}
           headerTV_med1a.setOnClickListener {
           headerTV_med1a.visibility = View.GONE
           headerTV_med1.visibility = View.VISIBLE}
   
           headerTV_med2.setOnClickListener {
           headerTV_med2.visibility = View.GONE
           headerTV_med2a.visibility = View.VISIBLE}
           headerTV_med2a.setOnClickListener {
           headerTV_med2a.visibility = View.GONE
           headerTV_med2.visibility = View.VISIBLE}
   
           headerTV_med3.setOnClickListener {
           headerTV_med3.visibility = View.GONE
           headerTV_med3a.visibility = View.VISIBLE}
           headerTV_med3a.setOnClickListener {
           headerTV_med3a.visibility = View.GONE
           headerTV_med3.visibility = View.VISIBLE}
   
           headerTV_med4.setOnClickListener {
           headerTV_med4.visibility = View.GONE
           headerTV_med4a.visibility = View.VISIBLE}
           headerTV_med4a.setOnClickListener {
           headerTV_med4a.visibility = View.GONE
           headerTV_med4.visibility = View.VISIBLE}
   
           headerTV_med5.setOnClickListener {
           headerTV_med5.visibility = View.GONE
           headerTV_med5a.visibility = View.VISIBLE}
           headerTV_med5a.setOnClickListener {
           headerTV_med5a.visibility = View.GONE
           headerTV_med5.visibility = View.VISIBLE}
   
           headerTV_med6.setOnClickListener {
           headerTV_med6.visibility = View.GONE
           headerTV_med6a.visibility = View.VISIBLE}
           headerTV_med6a.setOnClickListener {
           headerTV_med6a.visibility = View.GONE
           headerTV_med6.visibility = View.VISIBLE}
   
           headerTV_med7.setOnClickListener {
           headerTV_med7.visibility = View.GONE
           headerTV_med7a.visibility = View.VISIBLE}
           headerTV_med7a.setOnClickListener {
           headerTV_med7a.visibility = View.GONE
           headerTV_med7.visibility = View.VISIBLE}
   
           headerTV_med8.setOnClickListener {
           headerTV_med8.visibility = View.GONE
           headerTV_med8a.visibility = View.VISIBLE}
           headerTV_med8a.setOnClickListener {
           headerTV_med8a.visibility = View.GONE
           headerTV_med8.visibility = View.VISIBLE}
   
           headerTV_med9.setOnClickListener {
           headerTV_med9.visibility = View.GONE
           headerTV_med9a.visibility = View.VISIBLE}
           headerTV_med9a.setOnClickListener {
           headerTV_med9a.visibility = View.GONE
           headerTV_med9.visibility = View.VISIBLE}
   
           headerTV_med10.setOnClickListener {
           headerTV_med10.visibility = View.GONE
           headerTV_med10a.visibility = View.VISIBLE}
           headerTV_med10a.setOnClickListener {
           headerTV_med10a.visibility = View.GONE
           headerTV_med10.visibility = View.VISIBLE}
   
           return binding.root//7.1.1       
       }
   }

...

伙计们,雪已经融化了,霜冻警告已经消失在记忆中。 是时候把电脑抛在脑后,在花园里弄脏我的手了。 明年冬天,也许我可以用这个项目完成 codelab。那么,也许,DataStore...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?