Java onCreateView holder被多次调用,并且视图未得到更新
问题是当数据刷新视图未得到更新时。 我的发现-Java onCreateView holder被多次调用,并且视图未得到更新,java,android,android-recyclerview,data-binding,android-livedata,Java,Android,Android Recyclerview,Data Binding,Android Livedata,问题是当数据刷新视图未得到更新时。 我的发现- 1.onCreateview被多次调用,因此存在多个binder对象 2.我检查了列表,更新的列表正在到达适配器 3.数据库中插入的数据是正确的 4.我已附加了与此相关的所有代码片段 5.我已将sqaureup库用于日历 package com.universal.best.habittracker.view import android.content.Context import android.os.Bundle
1.onCreateview被多次调用,因此存在多个binder对象
2.我检查了列表,更新的列表正在到达适配器
3.数据库中插入的数据是正确的
4.我已附加了与此相关的所有代码片段
5.我已将sqaureup库用于日历
package com.universal.best.habittracker.view
import android.content.Context
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import `androidx.databinding.DataBindingUtil`
import androidx.fragment.app.*
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import com.universal.best.habittracker.R
import com.universal.best.habittracker.databinding.ActivityMainBinding
import com.universal.best.habittracker.repository.entity.ActivityEntityClass
import com.universal.best.habittracker.view.adapter.ActivityListAdapter
import com.universal.best.habittracker.view.adapter.ActivityStatusAdapter
import com.universal.best.habittracker.viewmodel.MainAcitivityViewModelProvider
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import java.util.*
class MainActivity() : AppCompatActivity(),
AddActivityFinishInterface, ActivityAdapterEventrack {
lateinit private var mainActivityDataBinding: ActivityMainBinding
lateinit private var viewModel: MainAcitivityViewModelProvider;
val fragmentManager: FragmentManager = supportFragmentManager;
val tag:String="MainActivity"
companion object {
var newFragment: DialogFragment? = null
internal lateinit var context: Context
internal lateinit var mainActivityContext: Context
fun setContext(con: Context, mainActivityContextt: Context) {
context = con
mainActivityContext = mainActivityContextt
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainActivityDataBinding = DataBindingUtil.setContentView(
this,
R.layout.activity_main
);
setContext(
applicationContext, this
);
viewModel = ViewModelProvider(this).get(MainAcitivityViewModelProvider::class.java)
var handleCLick =
HandleCLick(
this,
fragmentManager, viewModel,
this
);
mainActivityDataBinding.clickHandler = handleCLick;
Log.d(tag,"Adapter created--")
var listAdapter = ActivityListAdapter(this);
Log.d(tag,"Adapter created with Hashcode--"+listAdapter.hashCode())
mainActivityDataBinding.listAdapter = listAdapter;
mainActivityDataBinding.recyclerView.adapter= listAdapter
mainActivityDataBinding.recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL ,false)
var statusAdapter = ActivityStatusAdapter();
mainActivityDataBinding.statusAdaptor = statusAdapter
mainActivityDataBinding.bottomRecylerView.setHasFixedSize(false);
viewModel.retreiveFromDb()
.observe(this, androidx.lifecycle.Observer { list ->
list?.let {
listAdapter.setAdapterData(list)
listAdapter.notifyDataSetChanged()
statusAdapter.setAdapter(list)
statusAdapter.notifyDataSetChanged()
}
})
viewModel.getSaveres()?.observe(this, androidx.lifecycle.Observer { viewModel.retreiveFromDb()
.observe(this, androidx.lifecycle.Observer { list ->
list?.let {
listAdapter.setAdapterData(list)
listAdapter.ListChangedSoCallNotify()
statusAdapter.clear()
statusAdapter.setAdapter(list)
statusAdapter.notifyDataSetChanged()
}
})
})
}
class HandleCLick(
val context: Context,
val fragmentManager: FragmentManager, val viewmodel: MainAcitivityViewModelProvider,
val addActivityFinishInterface: AddActivityFinishInterface
) {
fun onClick(view: View) {
when (view.id) {
R.id.imageView -> {
newFragment =
AddActivityDialogueFragment(
addActivityFinishInterface
)
newFragment?.show(fragmentManager, "dialog")
};
else -> {
Toast.makeText(context, "Invalid Input", Toast.LENGTH_SHORT).show()
};
}
}
}
@Override
override fun clickHandler(activtyName: String, list: ArrayList<Date>?) {
Toast.makeText(this, activtyName, Toast.LENGTH_SHORT).show()
newFragment?.dismiss()
var len: Int = list?.size ?: 0
when {
len == 1 -> {
Toast.makeText(this, "Valid date range selected ", Toast.LENGTH_SHORT)
.show()
list?.let {
viewModel.saveintoDB(activtyName, list.get(0), list.get(len - 1), "0") }
}
else -> Toast.makeText(this, "Valid date range not selected ", Toast.LENGTH_SHORT)
.show()
}
}
@Override
override fun onDestroy() {
super.onDestroy()
viewModel.close();
}
override fun deleteTriggered(model: ActivityEntityClass) {
viewModel.deleteEntityFromDB(model)
}
override fun viewChartTriggered() {
}
override fun imageCharTriggered() {
}
Above is my mainActivity
myAdapterClass
package com.universal.best.habittracker.view.adapter
import android.app.AlertDialog
import android.content.DialogInterface
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.RecyclerView
import com.universal.best.habittracker.R
import com.universal.best.habittracker.databinding.TopActivitiesItemLayoutBinding
import com.universal.best.habittracker.repository.entity.ActivityEntityClass
import com.universal.best.habittracker.view.ActivityAdapterEventrack
import com.universal.best.habittracker.view.MainActivity
import com.universal.best.habittracker.view.MainActivity.Companion.context
import com.universal.best.habittracker.view.MainActivity.Companion.mainActivityContext
class ActivityListAdapter(var adaptercallBackInterface: ActivityAdapterEventrack) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var list: List<ActivityEntityClass>? = null
val tag: String = "ActivityListAdapter"
lateinit var myViewHolder: MyViewHolder
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater =LayoutInflater.from(parent.context)
val databinder = TopActivitiesItemLayoutBinding.inflate(inflater);
Log.d(tag, "onCreate dataBinder--" + databinder.hashCode());
myViewHolder = MyViewHolder(databinder);
Log.d(tag, "onCreate viewholder--" + myViewHolder.hashCode());
var Handler = MyClickHandler(adaptercallBackInterface)
databinder.myclickHanlder = Handler
return myViewHolder;
}
override fun getItemCount(): Int {
return list?.size ?: 0
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
myViewHolder.bindData(list, position);
}
override fun getItemViewType(position: Int): Int {
return position
}
fun setAdapterData(list: List<ActivityEntityClass>?) {
this.list = list
}
class MyViewHolder( databinder: TopActivitiesItemLayoutBinding) :
RecyclerView.ViewHolder(databinder.root) {
val databinderr: TopActivitiesItemLayoutBinding = databinder
fun bindData(
list: List<ActivityEntityClass>?,
i: Int
) {
databinderr.model = list?.get(i)
databinderr.executePendingBindings()
}
}
class MyClickHandler(var eventrack: ActivityAdapterEventrack) {
fun onclick(view: View, entityClass: ActivityEntityClass) {
when (view.id) {
R.id.imageView2 -> {
//open dialogbox and on yes delete it from db..
val dialogClickListener =
DialogInterface.OnClickListener { dialog, which ->
when (which) {
DialogInterface.BUTTON_POSITIVE -> {
Toast.makeText(
MainActivity.mainActivityContext,
"Activity name is ${entityClass.activityName}",
Toast.LENGTH_SHORT
).show()
eventrack.deleteTriggered(entityClass)
}
DialogInterface.BUTTON_NEGATIVE -> {
}
}
}
var builder: AlertDialog.Builder = AlertDialog.Builder(mainActivityContext)
builder.setMessage("Are you sure to delete this activity?")
.setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener).show()
}
R.id.imageView4 -> {
//open new actiivty with intent
}
}
}
}
fun ListChangedSoCallNotify() {
notifyDataSetChanged()
}
}
mainActivty layout
<?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="clickHandler"
type="com.universal.best.habittracker.view.MainActivity.HandleCLick" />
<variable
name="listAdapter"
type="com.universal.best.habittracker.view.adapter.ActivityListAdapter" />
<variable
name="statusAdaptor"
type="com.universal.best.habittracker.view.adapter.ActivityStatusAdapter" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/homepage_bg"
tools:context=".view.Activity.MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginLeft="40dp"
android:layout_marginTop="48dp"
android:fontFamily="sans-serif-condensed"
android:text="Add New Habit to Track"
android:textColor="#FFFF"
android:textSize="@dimen/_18sdp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/imageView"
android:layout_width="@dimen/_50sdp"
android:layout_height="@dimen/_50sdp"
android:layout_marginTop="28dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:background="@drawable/ic_add"
android:onClick="@{(view)->clickHandler.onClick(view)}"
app:layout_constraintBottom_toBottomOf="@+id/textView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.945"
app:layout_constraintStart_toEndOf="@+id/textView"
app:layout_constraintTop_toTopOf="@+id/textView"
app:layout_constraintVertical_bias="0.738" />
<TextView
android:id="@+id/notext"
android:layout_width="wrap_content"
android:layout_height="23dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
tools:text="You are not tracking any habbit" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="72dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView"
tools:listitem="@layout/top_activities_item_layout" />
<TextView
android:id="@+id/textView3"
android:layout_width="149dp"
android:layout_height="24dp"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="40dp"
android:textColor="#FFFFFF"
android:textSize="@dimen/_18sdp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/recyclerView"
android:text="Habbit Status" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/bottomRecylerView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="8dp"
android:adapter="@{statusAdaptor}"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constrainedHeight="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView3"
app:layout_constraintVertical_bias="1.0"
tools:listitem="@layout/habit_staus_item" />
<TextView
android:textSize="@dimen/_14sdp"
android:textColor="#FFFF"
android:fontFamily="sans-serif-condensed"
android:id="@+id/textView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Select Other date"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.588"
app:layout_constraintStart_toEndOf="@+id/textView3"
app:layout_constraintTop_toTopOf="@+id/textView3" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
adapter layout
<?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="model"
type="com.universal.best.habittracker.repository.entity.ActivityEntityClass" />
<variable
name="myclickHanlder"
type="com.universal.best.habittracker.view.adapter.ActivityListAdapter.MyClickHandler" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/itemview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:orientation="vertical"
app:layout_constraintLeft_toLeftOf="parent">
<TextView
android:id="@+id/Yoga"
android:layout_width="123dp"
android:layout_height="174dp"
android:background="@drawable/activity_item_background_color"
android:fontFamily="monospace"
android:gravity="center"
android:text="@{model.activityName}"
android:textColor="#FFFFFF"
android:textSize="@dimen/_30sdp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Yoga" />
<ImageView
android:onClick="@{(view)->myclickHanlder.onclick(view,model)}"
android:id="@+id/imageView2"
android:layout_width="@dimen/_70sdp"
android:layout_height="@dimen/_50sdp"
android:layout_marginTop="12dp"
android:layout_marginEnd="144dp"
android:layout_marginRight="144dp"
app:layout_constraintEnd_toEndOf="@+id/Yoga"
app:layout_constraintHorizontal_bias="0.294"
app:layout_constraintStart_toStartOf="@+id/Yoga"
app:layout_constraintTop_toBottomOf="@+id/Yoga"
app:srcCompat="@drawable/deleete" />
<ImageView
android:onClick="@{(view)->myclickHanlder.onclick(view,model)}"
android:id="@+id/imageView4"
android:layout_width="@dimen/_45sdp"
android:layout_height="@dimen/_45sdp"
android:layout_marginTop="@dimen/_10sdp"
app:layout_constraintEnd_toEndOf="@+id/Yoga"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="@+id/Yoga"
app:layout_constraintTop_toBottomOf="@+id/Yoga"
app:srcCompat="@drawable/chart" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
package com.universal.best.habittracker.view
导入android.content.Context
导入android.os.Bundle
导入android.util.Log
导入android.view.view
导入android.widget.Toast
导入androidx.appcompat.app.appcompat活动
导入`androidx.databinding.DataBindingUtil`
导入androidx.fragment.app*
导入androidx.lifecycle.LiveData
导入androidx.lifecycle.ViewModelProvider
导入androidx.recyclerview.widget.LinearLayoutManager
导入com.universal.best.habittracker.R
导入com.universal.best.habittracker.databinding.ActivityMainBinding
导入com.universal.best.habittracker.repository.entity.ActivityEntityClass
导入com.universal.best.habittracker.view.adapter.ActivityListAdapter
导入com.universal.best.habittracker.view.adapter.ActivityStatusAdapter
导入com.universal.best.habittracker.viewmodel.MainAcitivityViewModelProvider
导入kotlinx.coroutines.Dispatchers
导入kotlinx.coroutines.GlobalScope
导入kotlinx.coroutines.launch
导入java.util*
类MainActivity():AppCompatActivity(),
添加ActivityFinishInterface,ActivityAdapterEntrack{
lateinit私有变量mainActivityDataBinding:ActivityMainBinding
lateinit私有var视图模型:MainActivityViewModelProvider;
val fragmentManager:fragmentManager=supportFragmentManager;
val标记:String=“MainActivity”
伴星{
var newFragment:DialogFragment?=null
内部lateinit变量上下文:上下文
内部lateinit var mainActivityContext:上下文
fun setContext(con:Context,mainActivityContext:Context){
上下文=con
mainActivityContext=mainActivityContext
}
}
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainActivityDataBinding=DataBindingUtil.setContentView(
这
R.layout.activity\u main
);
setContext(
applicationContext,这是
);
viewModel=ViewModelProvider(this).get(MainAcitivityViewModelProvider::class.java)
var handleCLick=
手舔(
这
fragmentManager、viewModel、,
这
);
mainActivityDataBinding.clickHandler=handleCLick;
Log.d(标记“适配器已创建--”)
var listAdapter=ActivityListAdapter(此);
Log.d(标记“使用Hashcode创建的适配器--”+listAdapter.Hashcode())
mainActivityDataBinding.listAdapter=listAdapter;
mainActivityDataBinding.recyclerView.adapter=listAdapter
mainActivityDataBinding.recyclerView.layoutManager=LinearLayoutManager(此,LinearLayoutManager.HORIZONTAL,false)
var statusAdapter=ActivityStatusAdapter();
mainActivityDataBinding.statusAdapter=状态适配器
mainActivityDataBinding.bottomRecylerView.setHasFixedSize(false);
viewModel.retreiveFromDb()
.observe(这个,androidx.lifecycle.observator{list->
名单?让我看看{
setAdapter.setAdapterData(列表)
listAdapter.notifyDataSetChanged()
statusAdapter.setAdapter(列表)
statusAdapter.notifyDataSetChanged()
}
})
viewModel.getSaveres()?.observe(这是androidx.lifecycle.Observer{viewModel.retreiveFromDb())
.observe(这个,androidx.lifecycle.observator{list->
名单?让我看看{
setAdapter.setAdapterData(列表)
listAdapter.ListChangedSocalNotify()
statusAdapter.clear()
statusAdapter.setAdapter(列表)
statusAdapter.notifyDataSetChanged()
}
})
})
}
类HandleCLick(
val context:context,
val碎片管理器:碎片管理器,val视图模型:MainActivityViewModelProvider,
val addActivityFinishInterface:addActivityFinishInterface
) {
趣味onClick(视图:视图){
何时(view.id){
R.id.imageView->{
新片段=
AddActivityDialogueFragment(
addActivityFinishInterface
)
newFragment?.show(碎片管理器,“对话框”)
};
其他->{
Toast.makeText(上下文,“无效输入”,Toast.LENGTH\u SHORT.show())
};
}
}
}
@凌驾
重写有趣的clickHandler(activtyName:String,list:ArrayList?){
Toast.makeText(this,activityname,Toast.LENGTH\u SHORT.show())
newFragment?.disclose()
变量len:Int=list?.size?:0
什么时候{
len==1->{
Toast.makeText(此“选择的有效日期范围”,Toast.LENGTH\u SHORT)
.show()
名单?让我看看{
viewModel.saventodb(activtyName,list.get(0),list.get(len-1),“0”)}
setContentView(R.layout.activity_main)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mainActivityDataBinding = DataBindingUtil.setContentView(
this,
R.layout.activity_main
);