Задать вопрос

Databinding и RecyclerView как объединить?

Есть объект History, у него два поля mTime и mItem.
Список объектов меняется после запроса к серверу и выводится через RecyclerView.
Как передать измененные данные используя Databinding?
Спасибо.
  • Вопрос задан
  • 1152 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 2
@AlexeyVD
Работа с данными в RecyclerView происходит через класс адаптер. Вот когда-то накидал простенький абстрактный адаптер, когда тестировал data binding:
public abstract class AbstractRecyclerAdapter<E> extends 
RecyclerView.Adapter<AbstractRecyclerAdapter.BindingHolder> {

    private List<E> mElements;

    public AbstractRecyclerAdapter() {
        mElements = new ArrayList<>();
    }

    public abstract int getItemLayoutId();
    public abstract int getVariableId();

    public void setElements(List<E> elements) {
        mElements = elements;
    }

    @Override
    public BindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(getItemLayoutId(), 
                     parent, false);
        return new BindingHolder(v);
    }

    @Override
    public void onBindViewHolder(BindingHolder holder, int position) {
        final E element = mElements.get(position);
        holder.getBinding().setVariable(getVariableId(), element);
        holder.getBinding().executePendingBindings();
    }

    @Override
    public int getItemCount() {
        return mElements.size();
    }

    public static class BindingHolder extends RecyclerView.ViewHolder {

        private ViewDataBinding binding;

        public BindingHolder(View itemView) {
            super(itemView);
            binding = DataBindingUtil.bind(itemView);
        }

        public ViewDataBinding getBinding() {
            return binding;
        }
    }
}


Пример реализации для класса History:
public class HistoryRecyclerAdapter<History> extends AbstractRecyclerAdapter<History> {
    public HistoryRecyclerAdapter() {
        super();
    }

    @Override
    public int getItemLayoutId() {
        return R.layout.item_history;
    }

    @Override
    public int getVariableId() {
        return BR.history;
    }
}


Добавляете и изменяете элементы в списке с помощью setElements() и notifyDataSetChanged():
mRecyclerAdapter.setElements(getData());
mRecyclerView.setAdapter(mRecyclerAdapter);
mRecyclerAdapter.notifyDataSetChanged();


Ну и в разметке вашего item_history должно быть объявление variable history с прочими биндингами:
...
    <data>
        ...
        <variable
            name="history "
            type="History " />
       ...
    </data>
...
Ответ написан
Комментировать
@davidnum95
Создаешь класс BindingAdapters, там пишешь метод:
@BindingAdapter("android:history")
    public static void setHistory(RecyclerView recyclerView, ArrayList<History> history) {
        ((HistoryAdapter)recyclerView.getAdapter()).setHistory(history);
    }

Затем в активити или фрагменте:
<android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:history="@{тут_твой_список_с_историей}"/>

Тем самым в адаптере будут всегда актуальные данные.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Tiberal
Обновить данные в RecyclerView. дернуть на нем notify метод(там их много выберите тот что вам подходит). RecyclerView обновит итемы, а бинды подтянут уже новые значения.
Mожно создать метод с аннотацией BindingAdapter внутри которого обновляете данные в адаптере и дергаете нотифи, прибиндить метод к RecyclerView в аргумент ему коллекцию с данными, которую раздавать через ObservableField. Каждый раз как в коллекцию будут сетиться данные будет дергаться метод и обновлять RecyclerView
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы