Я использую привязку данных Android с помощью RecyclerView.Adapter
. На onCreateViewHolder
Adapter
«s я называю:привязки данных привязки данных при рендеринге
public TransfersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new MyViewHolder(
ListItemMyDataBinding.inflate(
LayoutInflater.from(parent.getContext()),
parent,
false));
}
ListItemMyDataBinding
Так это представление list_item_my_data.xml
.
Adapter
«s onBindViewHolder
выглядит примерно так:
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
MyData myData = mDataList.get(position);
holder.render(myData);
....
}
И, наконец, render
функция моего MyViewHolder
выглядит следующим образом:
public void render(MyData data, boolean expand) {
mBinding.setData(data); // mBinding is an instance of ListItemMyDataBinding
}
И в моем xml
s есть некоторые привязки данных :
<data>
<import type="com.example.MyData" />
<variable
name="data"
type="MyData" />
</data>
...
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{data.userName}" />
Я использую этот подход в списке для поиска, поэтому у меня есть поле поиска вверху списка. Когда пользователь вводит новый термин поиска, список очищается и уведомляется об изменении, как только ответ возвращается с сервера, я добавляю все результаты в список и снова уведомляю об этом изменении.
И наконец проблема в том, что происходит следующее:
- новый поисковый термин вошел: список очищается, элементы удалены [OK]
- ответ приходит назад от сервера [OK]
- I добавьте все элементы в список и уведомите адаптер об изменении [OK]
- за долю секунды старые значения появляются в списке, а элементы списка будут обновляться новыми значениями только после этого [NOT OK]
Как я понимаю, это потому, что View
s повторно используются и в качестве первого шага адаптер понимает, что он может повторно использовать вид и отображает его, и только (доля секунды) после того, как он применяет изменения в макете (посредством привязки данных), поэтому я вижу, что старые значения мерцают. Это довольно раздражает. Если в функции render
Я вручную установил значение по умолчанию для видов (например, setText("")
на TextView
), то я не вижу этого мигающего эффекта, но это не решение, которое я хочу.
Есть ли у вас какие-либо предложения, как я могу избежать этого эффекта «мигания/запаздывания», что я делаю неправильно?
Благодаря
Awesome, спасибо :) я не прокручивать вниз достаточно [на странице учебник] (https: // разработчик. android.com/topic/libraries/data-binding/index.html), чтобы увидеть упоминание этой функции и ее важность. – ktamas
приветствуются – Blackbelt