たとえば、RecyclerViewのアイテムの高さを画面の高さの30%にするにはどうすればよいですか?
ConstraintLayoutまたはPercentFrameLayout/PercentRelativeLayoutを単純に使用することはできません。これらは、サイズが画面と一致しない可能性のある親レイアウトに対して子レイアウトを配置するためです。
できれば、純粋なXMLでこれを行いたい(そして、画面の高さを動的に取得するためにRunnableを使用する必要はありません)。
[〜#〜] edit [〜#〜]
明確にするために、多くのソリューションがRecyclerViewの高さを抑えることを提案しているため、それは意図ではありません。 RecyclerViewは引き続き画面に表示されます。ここでは、(高さの代わりに)画面の幅を使用して話しています。
アイデアは、カードの幅を画面の幅の33%にすることです。一方、RecyclerViewの幅は、画面を水平にスクロールするときに変更されません。
私が知っているXMLでこれを行う方法はありません。ただし、前にRunnable
のViewHolder
のitemView
を設定することにより、Java(LayoutParams
sなどなし))で実行できます。アダプターの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);
}
特定のサイズを強制するために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
が画面に収まることを保証します。
表示指標を使用できます
コンストラクターで表示メトリックを定義するか、他の静的メソッドの初期化を使用します。
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()で使用できます。
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%の正確な結果は得られません。ただし、画面に応じて調整できます。