2016-12-07 3 views
2

Я использую привязку данных Android с помощью RecyclerView.Adapter. На onCreateViewHolderAdapter «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), то я не вижу этого мигающего эффекта, но это не решение, которое я хочу.

Есть ли у вас какие-либо предложения, как я могу избежать этого эффекта «мигания/запаздывания», что я делаю неправильно?

Благодаря

ответ

4

вызов

mBinding.executePendingBindings(); 

только после того, как mBinding.setData(data);

+0

Awesome, спасибо :) я не прокручивать вниз достаточно [на странице учебник] (https: // разработчик. android.com/topic/libraries/data-binding/index.html), чтобы увидеть упоминание этой функции и ее важность. – ktamas

+0

приветствуются – Blackbelt

Смежные вопросы