我有一个小问题,当我在我的 Activity 中观察 Livedata 时注释掉 onChanged 中的 binding.setData(dataContainer); 时,我无法更新 UI,当我取消注释时,UI 会更新。 如果您觉得有必要,请指导并进行一些代码审查。
我有一个每 x 秒重复运行一次的 Runnable。这是我在 Activity 中观察到的实时数据。
谢谢。
public class MainActivity extends AppCompatActivity {
TextOnScreen dataContainer;
ActivityMainBinding binding;
ViewModelClass modelClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
modelClass = ViewModelProviders.of(this).get(ViewModelClass.class);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
dataContainer = new TextOnScreen("hello");
binding.setData(dataContainer);
modelClass.getLiveData().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
Log.e("TAG", "--onChanged--" + s);
dataContainer.onscreen.set(s);
// this line allows the textview to update
// other wise no change on UI is seen
binding.setData(dataContainer);
}
});
}
}
public class TextOnScreen {
public final ObservableField<String> onscreen=new ObservableField<>();
public TextOnScreen(String t) {
onscreen.set(t);
}
public String getOnscreen() {
return onscreen.get();
}
public void setOnscreen(String onscreen) {
this.onscreen.set(onscreen);
}
}
public class ViewModelClass extends ViewModel{
private MutableLiveData<String> liveData;
public ViewModelClass() {
ModelClass modelClass = new ModelClass();
liveData= modelClass.generateName();
}
public LiveData<String> getLiveData() {
return liveData;
}
}
public class ModelClass {
MutableLiveData<String > data =new MutableLiveData<>();
MutableLiveData<String> generateName(){
final android.os.Handler handler=new android.os.Handler();
Runnable runnable=new Runnable() {
@Override
public void run() {
data.setValue(data.getValue()+"*");
handler.postDelayed(this,1000);
}
};
handler.postDelayed(runnable,2000);
return data;
}
}
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="data"
type="dsfa.drish.com.livedatasample.TextOnScreen"/>
</data>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{data.onscreen}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
</layout>
最佳答案
对我来说,它只是缺少:
binding.setLifecycleOwner(this);
关于android - LiveData 和 ViewModel 不更新 textview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50213497/