我目前需要使用RecyclerView(或ListView),但项目数固定为4.我希望这4个项目同样使用屏幕上的可用空间。除了应用栏之外,RecyclerView是屏幕上唯一的视图。即RecyclerView将layout_height
设置为match_parent
。我选择了RecyclerView,因为项目具有不同的布局,具体取决于模型状态。
我还没有查找,但我确信我可以在Java代码中以编程方式为每个项目设置高度。但是,如果我可以在XML中指定它,那似乎是不优雅的。在我写这篇文章时,我的右边的类似问题回答了这个问题。
我在item_layout.xml文件中尝试了以下内容,layout_weight
在其他场景中的使用方式如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="0dp">...</LinearLayout>
但是屏幕上没有显示任何内容。
我想知道的是,我可以使用layout_weight
或其他东西在布局XML中执行此操作吗?如果是这样,怎么样?
正如API reference所说,layout_weight
是LinearLayout
的一个属性,因此它不能与其他ViewGroups一起使用,例如RecyclerView
和ListView
。相反,您必须以编程方式设置项目的高度。
由于您似乎担心代码的清洁度,我认为这是一个相当优雅的解决方案,以防您使用RecyclerView
:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater
.from(parent.getContext())
.inflate(R.layout.item_list, null);
int height = parent.getMeasuredHeight() / 4;
int width = parent.getMeasuredWidth();
view.setLayoutParams(new RecyclerView.LayoutParams(width, height));
return new ViewHolder(view);
}
试试这个,为我工作
int weight = 3; //number of parts in the recycler view.
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View rowView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row,parent,false);
rowView.getLayoutParams().height = parent.getHeight() / weight;
return new ViewHolder(rowView);
}
我遇到了这个问题,因为我有一个带有变量条目的RecyclerView。我的水平RecyclerView需要至少适应三个视图而不会溢出,所以我构建了我的视图,以便在运行时调整大小以适应屏幕。
class MyRecyclerView extends RecyclerView.Adapter<ViewHolder> {
int mViewWidth;
public MyRecyclerView(Context context) {
mViewWidth = defineViewWidth(context);
}
private int defineViewWidth(Context context) {
int definedWidth = (int) context.getResources().getDimension(R.dimen.default_view_width);
DisplayMetrics dm = new DisplayMetrics();
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(dm);
if (definedWidth * 3 > dm.widthPixels) {
return dm.widthPixels / 3;
}
return definedWidth;
}
...
}
定义宽度后,需要设置视图宽度:
@Override
public ViewHolder onCreateViewHolder(ViewHolder holder, int position) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false);
ViewGroup.LayoutParams params = v.getLayoutParams();
params.width = mViewWidth;
v.setLayoutParams(params);
return new ViewHolder(v);
}
您可以轻松修改此项,以确保您的RecyclerView可以根据需要适合尽可能多的元素(垂直或水平)。
通过ItemDecoration:
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
int itemWidth = parent.getMeasuredWidth() / 7;
view.getLayoutParams().width = itemWidth;
}