gpt4 book ai didi

java - 如何在 Android 中手动正确重新加载 liveData?

转载 作者:行者123 更新时间:2023-11-30 01:59:05 26 4
gpt4 key购买 nike

我的应用程序是一个基本的新闻应用程序,它从 Guardian API 提供的 JSON 中获取数据。我使用原始 java 代码(不使用改造)解析了 JSON 中的值。

然后我在 NewsFeedViewModel 类中获取 LiveData,该类扩展为 AndroidViewModel。

然后在 fragment 中,我将列表提交给适配器。

这些是我面临的问题:1)首先,如果要显示的文章设置为 10,那么如果我转到设置并将其更改为 2,那么最后 8 篇文章就会消失,但空白/间隙不会消失。我仍然可以在空白处滚动。2)如果我不断更改文章数量值,那么应用程序将变得不可滚动。

还有一些疑问,当swipeToRefresh发生时如何手动刷新数据?

这是我的项目github链接:https://github.com/sdzshn3/News24-7-RV

应用程序中发生的问题的视频示例:https://drive.google.com/file/d/1gr_fabS2rqREuyecvGSG3IQ_jXOowlW7/view?usp=drivesdk

最佳答案

Kotlin 风格:

class RefreshableLiveData<T>(
private val source: () -> LiveData<T>
) : MediatorLiveData<T>() {

private var liveData = source()

init {
this.addSource(liveData, ::observer)
}

private fun observer(data: T) {
value = data
}

fun refresh() {
this.removeSource(liveData)
liveData = source()
this.addSource(liveData, ::observer)
}
}

示例:

class MainActivity : AppCompatActivity() {
private val viewModel: MyViewModel by viewModel()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

viewModel.goals.observe(this) { result ->
// update UI
}

// refresh
viewModel.refresh()
}
}

class MyViewModel(useCase: MyUseCase): ViewModel() {

private val _goals = RefreshableLiveData {
useCase.getGoals()
}

val goals: LiveData<Result<List<GoalItem>>>
get() = _goals.map(GoalItem::fromEntity)

fun refresh() {
_goals.refresh()
}
}

class MyUseCase {...}
...

关于java - 如何在 Android 中手动正确重新加载 liveData?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53467820/

26 4 0