如何在RecyclerView或ListView项目视图中使用layout_weight使高度相等的项目填满屏幕上的可用空间?

我目前需要使用RecyclerView(或ListView),但是项目的数量固定为4.我希望这4个项目同样使用屏幕上的可用空间。 RecyclerView是屏幕上唯一的视图,除了应用程序栏。 即RecyclerView将layout_height设置为match_parent 。 我select了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> 

但是在屏幕上什么也没有显示。

我想知道的是, 我可以在布局XML中使用layout_weight或其他方法来做到这一点吗? 如果是这样,怎么样?

Solutions Collecting From Web of "如何在RecyclerView或ListView项目视图中使用layout_weight使高度相等的项目填满屏幕上的可用空间?"

正如API参考所说, layout_weightLinearLayout一个属性,所以它不能像其他ViewGroup一样使用,比如RecyclerViewListView 。 相反,您必须以编程方式设置项目的高度。

既然您似乎担心您的代码的清洁,我认为这是一个相当优雅的解决scheme,以防您使用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需要适应至less三个视图没有溢出,所以我构build我的意见,在运行时resize,以适应屏幕。

 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可以根据你的需要(垂直或水平)适应多个元素。