vivchar/RendererRecyclerViewAdapter

ViewState overrides value from Model

vivchar opened this issue · 2 comments

  1. create list with EditTexts
  2. create viewstate
  3. save value of edit text
  4. viewmodel of editText also has this value
    5 open list
    Result: empty value

Also I created InputFragment to demonstrate this

renderer.performBindView(item, holder);
restoreViewState(holder);

//...

protected void restoreViewState(@NonNull final ViewHolder holder) {
	if (holder.isSupportViewState()) {
		final ViewState viewState = mViewStates.get(holder.getViewStateID());
		final boolean hasSavedViewState = viewState != null;

		if (hasSavedViewState) {
			viewState.restore(holder);
		} else {
			clearViewState(holder);
			if (hasChildren(holder)) {
				getChildAdapter((CompositeViewHolder) holder).clearViewStates();
			}
		}
	}
}

should be:

clearViewStateifNeed(holder); /* we should clear previous view state before bindView */
renderer.performBindView(item, holder);
restoreViewState(holder); /* we should restore view state after bindView */

//...

protected void clearViewStateifNeed(@NonNull final ViewHolder holder) {
	if (holder.isSupportViewState()) {
		final ViewState viewState = mViewStates.get(holder.getViewStateID());
		final boolean hasSavedViewState = viewState != null;

		if (!hasSavedViewState) {
			clearViewState(holder);
			if (hasChildren(holder)) {
				getChildAdapter((CompositeViewHolder) holder).clearViewStates();
			}
		}
	}
}

protected void restoreViewState(@NonNull final ViewHolder holder) {
	if (holder.isSupportViewState()) {
		final ViewState viewState = mViewStates.get(holder.getViewStateID());
		final boolean hasSavedViewState = viewState != null;

		if (hasSavedViewState) {
			viewState.restore(holder);
		}
	}
}

will be released with v3.0.0