RecyclerViewStaggeredGridLayoutManagerウォーターフォールフローの実装で発生した問題

1.以下のコードは、主にレイアウトが乱れた後の自動修復と、アイテムの左右交換の問題を防ぐために使用されます。私が遭遇した問題の中で、setGapStrategyのみが設定されていると、スライドして戻るときにリストの一番上に空白の問題が発生します。したがって、自動的に計算するにはシステムをオンにする必要があります。

StaggeredGridLayoutManager layoutManager =
        new StaggeredGridLayoutManager(SPAN_COUNT, StaggeredGridLayoutManager.VERTICAL);
    // 开启系统自动计算,列表机制默认开启状态。
    layoutManager.setAutoMeasureEnabled(true);
    // 防止item交换位置
    layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);

2.上記のコードを使用しても、レイアウトのちらつきや混乱の問題は解決できません。これは、各アイテムの高さが異なるためです。現在100番目のアイテムが表示されている場合は、リストの中央にデータを挿入してください。 adapter ... notifyDataSetChanged()グローバルリフレッシュにより、レイアウトは現在の位置で再描画とロードを開始します。したがって、後ろにスライドすると、徐々に上向きに描画し続けます。これにより、position == 0に描画したときに上部に残りのスペースができます。その理由は、データを挿入または追加するときに、グローバル更新操作を実行するためです。したがって、データを挿入するには、adapter.notifyItemRangeInserted(startPosition、count);およびadapter ... notifyItemInserted(position);を使用してください。代わりに、解決できます。

3.ウォーターフォールフローに仕切りを追加する問題は、getItemOffsetsメソッドで行われることを誰もが知っています。しかし、問題はここにあります。なぜなら、私が遭遇した滝は一種の不規則な滝だからです。

2つの縦の列に滝を表示している場合、リストのインデックス番号は次のとおりです。0、1、2、3、4、5、6、7、8、9
まず、通常の滝とは何かについて説明しましょう。各アイテムのサイズと高さは同じです。レイアウトは、左が0、右が1、左が2、右が3、左が4、右が5、左が6、7が左、左に8、右に9滝の流れ。そして、ほとんどの投稿はgetItemOffsetsにあり、位置を取得し、係数を使用してアイテムが左にあるか右にあるかを計算し、さまざまな位置に左右のマージンを設定します。

私が遭遇したのは、各アイテムの高さが異なるため、アイテムの非標準の配置インデックスにつながり、モジュロでアイテムの位置を判断して、位置のマージンを設定することは完全に不可能です。唯一の方法は、この問題を解決するために同じ左、右、および中央のスペースを設定することです。そうしないと、モジュラスの取得方法に応じてレイアウトが適切になりません。だから、間違いなく尋ねる人もいるでしょう、私が作ったUIの左右の余白は15dpで、真ん中は10dpです、どうすればいいですか?最も簡単な方法は、製品の観点からそれを解決し、魅力を使って製品を説得し、左、中央、右の間隔を同じにすることです_

package oliver.zhantao.oliverframe.decoration;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.TypedValue;
import android.view.View;

import androidx.recyclerview.widget.RecyclerView;

/**
 * Created by Oliver on 2020/12/30.
 */

public class StaggeredDividerItemDecoration extends RecyclerView.ItemDecoration {
    
    

  private int mDividerWidth;
  private int mDividerBottom;

  /**
   * 上下文
   * @param context
   */
  public StaggeredDividerItemDecoration(Context context) {
    
    
    mDividerWidth =
        (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 7, context.getResources().getDisplayMetrics());
    mDividerBottom =
        (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30, context.getResources().getDisplayMetrics());
  }

  @Override
  public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    
    

    // item左右两边的间隔
    outRect.left = mDividerWidth;
    outRect.right = mDividerWidth;

    // item下方的间隔
    outRect.bottom = mDividerBottom;
  }

  @Override
  public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
    
    
    super.onDraw(c, parent, state);
  }
}

著者:
Cangshuipu魔女クラウドブログ:http://blog.csdn.NET/amir_zt/
よりオリジナル、ソースを示してください、ありがとう。
https://blog.csdn.net/amir_zt/article/details/111951147

おすすめ

転載: blog.csdn.net/u011635351/article/details/111951147