5

に があり、StaggeredGridRecyclerView画像の高さを動的に設定しようとしていonBindViewHolderます。StaggeredGridはこれをすべて自動的に処理するはずだと思ったので、 に と を設定android:layout_width="match_parentandroid:scaleType="fitStartましたImageViewが、画像の周りに多くのギャップがあります。

はそれに対応してStaggeredGridいないため、 で画像の高さを動的に定義することで少し助けようとしていonBindViewHolderます。画像の幅と高さは事前にわかっていますが、グリッドのセル幅がありません。holder.cardView.getLayoutParams().widthとを試しgetMeasuredWidth()ましたが、どちらもゼロまたは小さい数値を返します。onBindViewHolderセル幅を利用できる場所が他にもあることは知っていますが、画像を設定および調整できるように、イベントで本当に必要です。

を活用してこれを達成する方法についてのアイデアはありStaggeredGridますか?アドバイスや経験は大歓迎です!

私の活動ではこれです:

mLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mLayoutManager);

私のアダプターでは:

@Override
public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) {
    MyModel item = mData.get(position);

    int imageWidth = item.getFeatured_image().getWidth();
    int imageHeight = item.getFeatured_image().getHeight();
    int cellWidth = 540; // <==== how to find dynamically??!!

    ViewGroup.LayoutParams imageLayoutParams = holder.thumbnailImageView.getLayoutParams();
    imageLayoutParams.width = cellWidth;
    imageLayoutParams.height = imageHeight * cellWidth / imageWidth;
    holder.thumbnailImageView.setLayoutParams(imageLayoutParams);

    MediaHelper.displayImage(item, holder.thumbnailImageView);
}

私のレイアウトでは:

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/row_my_card"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    card_view:cardCornerRadius="2dp">

    <ImageView
        android:id="@+id/row_my_thumbnail_image"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:scaleType="fitStart" />

    <TextView
        android:id="@+id/row_my_title_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="#CCFFFFFF"
        android:textStyle="bold"
        android:padding="5dp" />
</android.support.v7.widget.CardView>

また、これを追加してセル幅を指定しようとしましたが、onGlobalLayoutイベントで画像が設定および調整された後にイベントがトリガーされるonBindViewHolderため、手遅れです。

@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // create a new view
    final View view = LayoutInflater.from(parent.getContext())
        .inflate(R.layout.row_my_post, parent, false);

    final MyViewHolder viewHolder = new MyViewHolder(view);

    ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
    if (viewTreeObserver.isAlive()) {
        viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                int viewWidth = view.getWidth();
                int viewHeight = view.getHeight();
            }
        });
    }

    return viewHolder;
}

これは、さまざまな画像サイズによるランダムなギャップです。私が望むのは、すべての画像がセルの幅になり、画像とセルの高さを動的に調整できるようにすることです。

ここに画像の説明を入力

4

3 に答える 3

0

セルの幅は、アクティビティ/フラグメント レベルで検出され、レンダリング時間の前にアダプターに渡されます。次のようなものを使用します。

this.staggeredGridLayoutManager.getWidth() / this.staggeredGridLayoutManager.getSpanCount()

このアプローチを使用すると、レンダリングの前にセルの高さを計算し、実行後のアプローチによって導入される最初のフリックを回避できます。また、画像の縦横比は保持され、画像をロードする前に必要なスペースを予約できます。

マージン/パディングが存在する場合は、それらを前の計算に含める必要があることにも注意してください。何かのようなもの:

(this.staggeredGridLayoutManager.getWidth() - marginsAndOrPaddings) / this.staggeredGridLayoutManager.getSpanCount()

更新: サポート パッケージ 23.2.0 以降、ライフサイクルのこの時点で、this.staggeredGridLayoutManager.getWidth()は 0 を返します。合計幅は、 this.recyclerView.getWidth()で達成できます。

于 2015-11-15T13:35:04.973 に答える