Адаптер не сразу отображается в соответствии с значением аргумента, а только после второго захода во фрагмент
У меня проблема. Приложение с "карточками" по английскому, в котором сверху слово, а если кликнуть карточку то появляется перевод снизу (становится VISIBLE). Есть переменная в Datastore - "TranslationDirection", которая определяет, на каком языке слово сверху, а на каком - снизу.
Все работает хорошо, НО - только НЕ при первом открытии. Если я первоначально открываю приложение, то сверху всегда будет слово на английском (дефолтное значение translationDirection), даже если в Datastore стоит русско-английский перевод. Если после этого я открою любой другой фрагмент, а потом вернусь на основной с карточками - тогда уже направление перевода правильное.
Не могу найти причину, буду благодарен если сможете подсказать.
Спасибо.
In Adapter:
public void onBindViewHolder(@NonNull JavaDrillerAdapter.JavaDrillerViewHolder holder, int position) {
Word currentWord = getItem(position);
if (!nativToForeign) {
holder.tvUpper.setText(currentWord.getForeign());
holder.tvDowner.setText(currentWord.getRus());
} else if (nativToForeign) {
holder.tvUpper.setText(currentWord.getRus());
holder.tvDowner.setText(currentWord.getForeign());
}
holder.tvDowner.setVisibility(View.INVISIBLE);
}
Dao method:
@Query("SELECT * FROM word_table WHERE category IN (SELECT categoryNumber FROM category_table WHERE categoryShown = 1) AND shown = 1 ORDER BY RANDOM() LIMIT 4")
fun get4wordsRx(): Single<List<Word>>
In ViewModel:
) : ViewModel() {
var mList = ArrayList<Word>()
val mLivedataList = MutableLiveData<List<Word>>()
val m4words = wordDao.get4wordsRx()
private val transDirFlow = preferencesManager.translationDirectionFlow
val readTransDir = transDirFlow.asLiveData() // добавил эти две строки
fun getLivedataList(): LiveData<List<Word>> {
return mLivedataList
}
fun get4words() {
m4words.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object :
SingleObserver<List<Word>> { // почитать почему тута object:-ом заменен джавный new
override fun onSubscribe(d: Disposable) {
composite.add(d)
}
override fun onSuccess(t: List<Word>) {
mList.addAll(t)
mLivedataList.value = mList
}
override fun onError(e: Throwable) {
// empty
}
})
}
InFragment:
class DrillerFragment : Fragment(R.layout.cardstack_layout), CardStackListener {
private val viewModel: DrillerViewModel by viewModels()
private lateinit var drillerAdapter: JavaDrillerAdapter/*? = null*/
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val binding = CardstackLayoutBinding.bind(view)
drillerAdapter = JavaDrillerAdapter(JavaDrillerAdapter.JavaDrillerDiff(), false, requireContext()
viewModel.getLivedataList().observe(viewLifecycleOwner) {
drillerAdapter.submitList(it)
}
binding.apply {
cardStackView.apply {
viewModel.readTransDir.observe(viewLifecycleOwner) {
drillerAdapter.setNativToForeign(it)
}
adapter = drillerAdapter
layoutManager = drillerLayoutManager
setHasFixedSize(true)
}
}
viewModel.get4words()
}
//other methods
In Datastore (in case it's needed):
val translationDirectionFlow = dataStore.data
.catch { exception ->
if (exception is IOException) {
Log.e(TAG, "Error reading preferences", exception)
emit(emptyPreferences())
} else {
throw exception
}
}
.map { preferences ->
val nativToForeign = preferences[PreferencesKeys.NATIV_TO_FOREIGN] ?: false
Log.d(TAG, "So, trans nativeTOForeign: " + nativToForeign)
nativToForeign
}