4

私は正常に動作している RecyclerView ( FlowLayoutManager ) のカスタム LayoutManager を使用しています。これは、子のレイアウトに使用される関数です。

@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state)
{

    detachAndScrapAttachedViews(recycler);

    final int count = this.getItemCount();
    views.clear();
    lines.clear();
    for (int i = 0; i < count; i++) {
        View child = recycler.getViewForPosition(i);
        addView(child);
        measureChildWithMargins(child, 0, 0);

        final LayoutParams lp = (LayoutParams) child.getLayoutParams();

        ViewDefinition view = new ViewDefinition(this.config, child);
        view.setWidth(child.getMeasuredWidth());
        view.setHeight(child.getMeasuredHeight());
        view.setNewLine(lp.isNewLine());
        view.setGravity(lp.getGravity());
        view.setWeight(lp.getWeight());
        view.setMargins(lp.leftMargin, lp.topMargin, lp.rightMargin, lp.bottomMargin);
        views.add(view);
    }


    this.config.setMaxWidth(this.getWidth() - this.getPaddingRight() - this.getPaddingLeft());
    this.config.setMaxHeight(this.getHeight() - this.getPaddingTop() - this.getPaddingBottom());
    this.config.setWidthMode(View.MeasureSpec.EXACTLY);
    this.config.setHeightMode(View.MeasureSpec.EXACTLY);
    this.config.setCheckCanFit(true);


    CommonLogic.fillLines(views, lines, config);
    CommonLogic.calculateLinesAndChildPosition(lines);


    int contentLength = 0;
    final int linesCount = lines.size();
    for (int i = 0; i < linesCount; i++) {
        LineDefinition l = lines.get(i);
        contentLength = Math.max(contentLength, l.getLineLength());
    }


    LineDefinition currentLine = lines.get(lines.size() - 1);
    int contentThickness = currentLine.getLineStartThickness() + currentLine.getLineThickness();
    int realControlLength = CommonLogic.findSize(this.config.getLengthMode(), this.config.getMaxLength(), contentLength);
    int realControlThickness = CommonLogic.findSize(this.config.getThicknessMode(), this.config.getMaxThickness(), contentThickness);


    CommonLogic.applyGravityToLines(lines, realControlLength, realControlThickness, config);


    for (int i = 0; i < linesCount; i++) {
        LineDefinition line = lines.get(i);
        applyPositionsToViews(line);
    }
}

唯一の問題は、notifyDataSetChanges() または notifyItemChanges() を呼び出すと、onLayoutChildren() が再度呼び出され、recyclerview 全体がコンテンツを変更し、スクロールして一番上に戻ることです。

LinearLayoutManager がこの問題をどのように制御するかを確認しようとしましたが、私が望むほど理解できませんでした。

RecyclerView を現在の状態に保ち、コンテンツのみを変更するにはどうすればよいですか? または、以前と同じ位置にスクロールするにはどうすればよいですか?

4

0 に答える 0