OnCreateViewHolderで膨張するマイリサイクルアイテム
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:gravity="center"
Android:orientation="vertical"
Android:padding="16dp">
<ImageView
Android:id="@+id/gridListImageView"
Android:layout_width="96dp"
Android:layout_height="96dp"
Android:src="@drawable/a" />
<TextView
Android:id="@+id/gridListView_title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginTop="20dp"
Android:text="Large Text"
Android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
このようなものを表示したい リサイクルビューの半分の高さの行が1つありますか?そして、残りのスペースにパディングを追加しますか? GridLayoutManagerでこれを実行できますか?
そして、これは私のGridLayoutManagerです
GridLayoutManager glm = new GridLayoutManager(getActivity(), 2);
recyclerView.setLayoutManager(glm);
アダプタでビューのレイアウトを拡張する場合、プログラムで高さを設定できます。使用する適切な高さを評価するために、親ViewGroup(つまり、RecyclerView自体)に依存できます。ここにサンプルがあります:
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = mLayoutInflater.inflate(R.layout.view_item, parent, false);
// work here if you need to control height of your items
// keep in mind that parent is RecyclerView in this case
int height = parent.getMeasuredHeight() / 4;
itemView.setMinimumHeight(height);
return new ItemViewHolder(itemView);
}
これが役立つことを願っています。
サポートライブラリ25.1.0の時点で、上記の回答は機能しません。以下の修正をお勧めします。
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
GridLayoutManager.LayoutParams lp = (GridLayoutManager.LayoutParams) v.getLayoutParams();
lp.height = parent.getMeasuredHeight() / 4;
v.setLayoutParams(lp);
return new ViewHolder(v);
}
アイテムの高さを設定する必要はありません。ここでの問題は、画像がすべてのスペースを埋めようとすることです。 ImageViewにAndroid:adjustViewBounds="true"
を追加するだけで、空白スペースは追加されません。
v.getLayoutParams().width = parent.getMeasuredWidth() / 2;
v.getLayoutParams().height = parent.getMeasuredWidth() / 2;
アダプターのinflateビューのサイズを取得すると、0または負の値が返される場合があります。別のアプローチは、アダプターの外側から必要なサイズを取得し、それを操作して表示するよう設定することです。私の場合、別の問題はサイズが効果的に設定されないことでした。だから私はレイアウトパラメータを使用してサイズを設定します
ここで私のアダプターを活動中に設定しています:
Display display = MainActivity.this.getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int y = size.y;
y=(int)y/2;
GridLayoutManager linearLayoutManager = new GridLayoutManager(MainActivity.this,2);
recyclerView.setLayoutManager(linearLayoutManager);
NewOrderAdapter newOrderAdapter=new NewOrderAdapter(MainActivity.this,arrayListname,arrayListimage,y);
recyclerView.setAdapter(newOrderAdapter);
そして、私はこのようにビューサイズを設定します:
@Override
public myviewholder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = inflator.inflate(R.layout.new_order_row, viewGroup, false);
GridLayoutManager.LayoutParams params = (GridLayoutManager.LayoutParams) view.getLayoutParams();
params.height = ysize;
view.setLayoutParams(params);
myviewholder holder = new myviewholder(view);
return holder;
}
また、初期化のためにレイアウトのレイアウトに高さを設定することを忘れないでください
現在の最近のAPIレベル25では、onCreateViewHolderのリサイクラからの高さは常に空です。このスニペットは、リサイクラビューのonMeasureが呼び出された後に高さを設定し、膨張したリストビューに正しい高さを設定します。
@Override
public DataBindingViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
// You may inflate your view here.
parent.post(new Runnable() {
@Override
public void run() {
int height = parent.getMeasuredHeight() / rows;
View view = holder.getBinding().getRoot();
view.getLayoutParams().height = height;
}
});
return holder;
}
これは、必要な実際のアスペクト比に基づいてリサイクルビュー要素の高さを調整するための私のコードです。
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.adapter_offers, parent, false);
int width = parent.getMeasuredWidth();
float height = (float) width / Config.ASPECT_RATIO;//(Width/Height)
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) itemView.getLayoutParams();
params.height = Math.round(height);
itemView.setLayoutParams(params);
return new MyViewHolder(itemView);
}