web-dev-qa-db-ja.com

Android RecyclerViewアイテムの画面幅の割合

たとえば、RecyclerViewのアイテムの高さを画面の高さの30%にするにはどうすればよいですか?

ConstraintLayoutまたはPercentFrameLayout/PercentRelativeLayoutを単純に使用することはできません。これらは、サイズが画面と一致しない可能性のある親レイアウトに対して子レイアウトを配置するためです。

できれば、純粋なXMLでこれを行いたい(そして、画面の高さを動的に取得するためにRunnableを使用する必要はありません)。

[〜#〜] edit [〜#〜]

明確にするために、多くのソリューションがRecyclerViewの高さを抑えることを提案しているため、それは意図ではありません。 RecyclerViewは引き続き画面に表示されます。ここでは、(高さの代わりに)画面の幅を使用して話しています。

enter image description here

アイデアは、カードの幅を画面の幅の33%にすることです。一方、RecyclerViewの幅は、画面を水平にスクロールするときに変更されません。

15
David Chu

私が知っているXMLでこれを行う方法はありません。ただし、前にRunnableViewHolderitemViewを設定することにより、Java(LayoutParamssなどなし))で実行できます。アダプターのonCreateViewHolder()メソッドでViewHolderを返します。

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View itemView = inflater.inflate(R.layout.itemview, parent, false);

    ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams();
    layoutParams.height = (int) (parent.getHeight() * 0.3);
    itemView.setLayoutParams(layoutParams);

    return new MyViewHolder(itemView);
}
23
Ben P.

特定のサイズを強制するためにLayoutManagerで使用されるRecyclerViewメソッドの1つをオーバーライドできます。

recyclerView.setLayoutManager(new LinearLayoutManager(this){
    @Override
    public boolean checkLayoutParams(RecyclerView.LayoutParams lp) {
        // force height of viewHolder here, this will override layout_height from xml
        lp.height = getHeight() / 3;
        return true;
    }
});

これは、RecyclerViewが画面に収まることを保証します。

15
Pawel

表示指標を使用できます

コンストラクターで表示メトリックを定義するか、他の静的メソッドの初期化を使用します。

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

これでonCreateViewHolder()で使用できます

View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);

//setting the height programmatically
itemView.getLayoutParams().height = metrics.heightPixels/3;
itemView.requestLayout();

または、レイアウトの親レイアウトでonBindViewHolder()で使用できます。

4
Ranjan

XMLのみでアイテムの高さを設定することはできません。実行時に膨張するアイテムである理由は、レイアウトのようなアクティビティではありません。 XMLで記述します。

だから今私はあなたにパーセント/重量を達成するための2つの方法を教えます

最初の好ましい方法は、Adapter内のonCreateViewHolder()メソッドで高さをオーバーライドすることです

private int height = 0; // declared height globally in Adapter class to reuse it.

@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
    if (height == 0)
        height = (int) (parent.getMeasuredHeight() * .3);
    itemView.setMinimumHeight(height);
    return new ItemViewHolder(itemView);
}

2番目のハックはを使用して [〜#〜] sdp [〜#〜] ライブラリ。

sdp say _160sdpでXMLのアイテムの高さを使用します。 30%の正確な結果は得られません。ただし、画面に応じて調整できます。

3
Khemraj