如何解决如何在 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 举报,一经查实,本站将立刻删除。