Универсальный адаптер RecyclerView с DataBinding

Я создал универсальный адаптер для RecyclerView с помощью DataBinding. Вот небольшой фрагмент кода

public class RecyclerAdapter<T, VM extends ViewDataBinding> extends RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder> {
private final Context context;
private ArrayList<T> items;
private int layoutId;
private RecyclerCallback<VM, T> bindingInterface;

public RecyclerAdapter(Context context, ArrayList<T> items, int layoutId, RecyclerCallback<VM, T> bindingInterface) {
    this.items = items;
    this.context = context;
    this.layoutId = layoutId;
    this.bindingInterface = bindingInterface;
}

public class RecyclerViewHolder extends RecyclerView.ViewHolder {

    VM binding;

    public RecyclerViewHolder(View view) {
        super(view);
        binding = DataBindingUtil.bind(view);
    }

    public void bindData(T model) {
        bindingInterface.bindData(binding, model);
    }

}

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

@Override
public void onBindViewHolder(RecyclerAdapter.RecyclerViewHolder holder, int position) {
    T item = items.get(position);
    holder.bindData(item);
}

@Override
public int getItemCount() {
    if (items == null) {
        return 0;
    }
    return items.size();
}
}

Вы можете найти полный код в репозитории Github: Recyclerview-Generic-Adapter

Проблема, с которой я столкнулся, заключается в том, что после использования универсального адаптера RecyclerView время загрузки увеличивается, и на секунду он показывает макет времени разработки, а затем загружает исходные данные.


person Ravi    schedule 14.11.2016    source источник
comment
Я предполагаю, что вы не используете свойства setHasFixedSize и setItemViewCacheSize и т.д.   -  person Radhey    schedule 14.11.2016


Ответы (1)


Часть, которую вам не хватает, это binding.executePendingBindings() в bindData:

public void bindData(T model) {
    bindingInterface.bindData(binding, model);
    binding.executePendingBindings();
}
person George Mount    schedule 14.11.2016