基于我之前的问题(Android持久性空间:"无法弄清楚如何从光标读取此字段")我得到了工作,感谢反馈,我在Kolin中实现了相同的示例(请参阅下面的代码).我不得不做一些小改动,比如现在传递给查询的参数必须作为"p0","p1"等传递.现在在Kotlin中我得到以下与UserWithPets类相关的错误:
错误:无法弄清楚如何从游标中读取此字段.e:private java.util.List pets;
@Dao
interface UserDAO {
@get:Query("SELECT * FROM user")
val all: LiveData<List<User>>
@Insert
fun insertUser(user: User) //single one
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertUsers(vararg users: User)
@Query("SELECT * FROM User")
fun loadUsersWithPets(): LiveData<List<UserWithPets>>
}
@Entity
class Pet( var name: String?, var ownerId: Int,@PrimaryKey(autoGenerate = true)var id:Int)
@Dao
interface PetDAO {
@Query("SELECT * FROM pet")
val all: List<Pet>
@Query("SELECT * FROM pet WHERE id IN (:p0)")
fun loadAllByIds(petIds: IntArray): List<Pet>
@Insert
fun insert(pet: Pet)
@Insert
fun insertAll(vararg …Run Code Online (Sandbox Code Playgroud) 我有一个类似聊天的活动,我使用带有PagedListAdaper的RecyclerView来加载一堆消息.我正在使用PositionalDataSource来加载数据.加载它的自我工作正常但是当我发送消息时,我使我的数据源无效并且列表被重新制作.我的问题是,当它这样做时它会闪烁:

我尝试添加setHasStableIds(true)并重写getItemId,它可以在一个简单的适配器上工作,但它似乎在这里不起作用.我似乎也无法将项添加到getCurrentList(),因为它不受支持.此外,我没有使用数据库,只是向服务器发出请求.
所以我的问题是,除了使数据源失效之外,还有更好的方法吗?有没有办法阻止列表在发送消息时闪烁?或者这个图书馆不适合我的聊天活动?
编辑:
我的差异回调
private val DIFF_CALLBACK: DiffCallback<MessageModel> = object : DiffCallback<MessageModel>() {
override fun areItemsTheSame(@NonNull oldMessage: MessageModel, @NonNull newMessage: MessageModel) =
oldMessage.id == newMessage.id
override fun areContentsTheSame(@NonNull oldMessage: MessageModel, @NonNull newMessage: MessageModel) =
oldMessage.equals(newMessage)
}
Run Code Online (Sandbox Code Playgroud)
Edit2我修复了它:
所以我设法通过使用PagedListAdapterHelper并在加载项目后设置它的列表来修复它:
private var mHelper: PagedListAdapterHelper<MessageModel>? = null
init {
mHelper = PagedListAdapterHelper(this, DIFF_CALLBACK)
setHasStableIds(true)
}
fun setList(pagedList: PagedList<MessageModel>) {
pagedList.addWeakCallback(pagedList.snapshot(), object:PagedList.Callback() {
override fun onChanged(position: Int, count: Int) {
}
override fun onInserted(position: Int, count: Int) {
mHelper?.setList(pagedList) …Run Code Online (Sandbox Code Playgroud) 我有一个POJO,我将其嵌入房间实体; 请注意,POJO在库模块中定义 ;
@Entity
public class Person {
@PrimaryKey
@NonNull
private String uuid;
@Embedded
@NonNull
private Address address;
public Person(@NonNull String uuid, @NonNull Address address) {
this.uuid = uuid;
this.address = address;
}
@NonNull
public String getUuid() {
return uuid;
}
@NonNull
public Address getAddress() {
return address;
}
}
public class Address {
@NonNull
private String street;
@NonNull
private String city;
public Address(@NonNull String street, @NonNull String city) {
this.street = street;
this.city = city;
}
@NonNull
public …Run Code Online (Sandbox Code Playgroud) 目前,我们正在使用LiveData,ViewModel并Room在我们的项目。
我们正在使用Java 8。
我们在下面使用 build.gradle
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.1"
// Room (use 1.1.0-beta1 for latest beta)
implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
Run Code Online (Sandbox Code Playgroud)
我想知道我们什么时候需要使用
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
Run Code Online (Sandbox Code Playgroud)
(或者implementation "android.arch.lifecycle:common-java8:1.1.1"因为我们正在使用Java 8 ?!)
目前,我们的代码可以正常运行,而无需使用lifecycle:compiler或lifecycle:common-java8。
我目前正在写一些UI单元测试片段,其中之一@Test是看是否显示正确的对象列表,这是不是一个集成测试,所以我想嘲笑的ViewModel.
片段的变量:
class FavoritesFragment : Fragment() {
private lateinit var adapter: FavoritesAdapter
private lateinit var viewModel: FavoritesViewModel
@Inject lateinit var viewModelFactory: FavoritesViewModelFactory
(...)
Run Code Online (Sandbox Code Playgroud)
这是代码:
@MediumTest
@RunWith(AndroidJUnit4::class)
class FavoritesFragmentTest {
@Rule @JvmField val activityRule = ActivityTestRule(TestFragmentActivity::class.java, true, true)
@Rule @JvmField val instantTaskExecutorRule = InstantTaskExecutorRule()
private val results = MutableLiveData<Resource<List<FavoriteView>>>()
private val viewModel = mock(FavoritesViewModel::class.java)
private lateinit var favoritesFragment: FavoritesFragment
@Before
fun setup() {
favoritesFragment = FavoritesFragment.newInstance()
activityRule.activity.addFragment(favoritesFragment)
`when`(viewModel.getFavourites()).thenReturn(results)
}
(...)
// This is …Run Code Online (Sandbox Code Playgroud) android mockito kotlin android-espresso android-architecture-components
如何正确使用WorkManagerAndroid Jetpack中的新功能来安排每天一次的定期工作,这应该每天做一次并且只做一次?
我们的想法是检查具有给定标签的工作是否已经存在WorkManager,否则开始新的定期工作.
我尝试使用下一种方法来做到这一点:
public static final String CALL_INFO_WORKER = "Call worker";
...
WorkManager workManager = WorkManager.getInstance();
List<WorkStatus> value = workManager.getStatusesByTag(CALL_INFO_WORKER).getValue();
if (value == null) {
WorkRequest callDataRequest = new PeriodicWorkRequest.Builder(CallInfoWorker.class,
24, TimeUnit.HOURS, 3, TimeUnit.HOURS)
.addTag(CALL_INFO_WORKER)
.build();
workManager.enqueue(callDataRequest);
}
Run Code Online (Sandbox Code Playgroud)
但value总是空,即使我把一个断点里面Worker的doWork()方法(所以它肯定是正在进行中),并从另一个线程检查工作状态.
android android-architecture-components android-jetpack android-workmanager
我们注意到AlarmManagerCompat,由于AlarmManager不同版本的操作系统中的行为不同,仅在我们的应用程序中实现警报/提醒功能并不是一种可靠的方法.(例如,打盹模式)
最初,我们计划使用Evernote的android-job库来帮助我们在应用程序中实现警报/提醒功能.
但是,在此过程中,我们也注意到谷歌刚刚发布WorkerManager.
到目前为止,WorkerManager当我们在应用程序退出后运行一些一次性后台作业(几乎是即时的,具有互联网连接约束)时,对我们来说效果很好.
我们计划使用WorkerManager实现警报/提醒功能.
我想知道,WorkerManager实现这样的功能有多可靠?有人尝试过吗?我们的目标是API 15及更高版本.
我试图在新的导航组件中找到一个方法,但我没有找到任何相关的方法.
我目前的目的地是:
mainHostFragment.findNavController().currentDestination
Run Code Online (Sandbox Code Playgroud)
但我无法获得任何对显示片段的引用.
android android-fragments kotlin android-architecture-components android-architecture-navigation
我正在尝试使用新的Android架构组件,并且在尝试将MVVM模型用于自定义视图时遇到了障碍.
基本上我已经创建了一个自定义视图来封装一个公共UI,它是在整个应用程序中使用的相应逻辑.我可以在自定义视图中设置ViewModel但是我必须在自定义视图中使用observeForever()或手动设置LifecycleOwner如下所示,但似乎都不正确.
observeForever()活动
class MyActivity : AppCompatActivity() {
lateinit var myCustomView : CustomView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
myCustomView = findViewById(R.id.custom_view)
myCustomView.onAttach()
}
override fun onStop() {
myCustomView.onDetach()
}
}
Run Code Online (Sandbox Code Playgroud)
自定义视图
class (context: Context, attrs: AttributeSet) : RelativeLayout(context,attrs){
private val viewModel = CustomViewModel()
fun onAttach() {
viewModel.state.observeForever{ myObserver }
}
fun onDetach() {
viewModel.state.removeObserver{ myObserver }
}
}
Run Code Online (Sandbox Code Playgroud)
活动
class MyActivity : AppCompatActivity() {
lateinit var myCustomView : CustomView
override fun onCreate(savedInstanceState: …Run Code Online (Sandbox Code Playgroud) android mvvm android-livedata android-viewmodel android-architecture-components
如何将参数传递给嵌套的Navigation体系结构组件图?
假设我构造了导航图以从导航FragmentA --> Nested,其中Nested包含FragmentB --> FragmentC...
如果这是一个纯FragmentA --> FragmentB...图形,我将使用设置导航FragmentADirections.actionFragmentAToFragmentB(argument = foo)。但是,一旦您B --> C变成Nested... ,该操作就会采用零参数。
那我该怎么办?
android android-architecture-components android-architecture-navigation
android ×10
android-architecture-components ×10
kotlin ×3
android-architecture-navigation ×2
android-room ×2
mockito ×1
mvvm ×1