方案
先写解决方案,在对应adapter的函数中设置item的最小宽度。
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View content = LayoutInflater.from(parent.getContext()).inflate(R.layout.lv_image_crop_item, parent, false);
ViewHolder viewHolder = new ViewHolder(content);
if(mItemCountOnScreen == -1){
mItemCountOnScreen = getItemCount();
}
//设置最小宽度 达到每个子view宽度计算成父控件整除mItemCountOnScreen个宽度的目的
viewHolder.itemView.setMinimumWidth(parent.getWidth()/mItemCountOnScreen);
return viewHolder;
}
案例
实际上没有什么硬性的需求,只不过是最近RecycleView使得比较顺手,之前应用中的一些类似横向列表的东西都打算拿出来换一换,一来能更加熟悉这个不算很新的控件;二来也方便后边的功能扩展。然而真正替换的时候发现原来直接使用布局均分宽度的横向选项,换过来之后都挤在了一起。看看各式各样的测试机就知道把宽度设置死显然不是个明智的选择,同时也没有在RecycleView和LayoutManager中找到合适的方法。
那么就剩下从布局上想办法了,实际上就算有个什么设置把列表等分为若干个子view的接口或者属性,最后还是要落到挨个给子view布局上的,最终的实现终究还是要靠最朴素的Measure、Layout、ondraw。View有这么一个方法:
/**
* Sets the minimum width of the view. It is not guaranteed the view will
* be able to achieve this minimum width (for example, if its parent layout
* constrains it with less available width).
*
* @param minWidth The minimum width the view will try to be.
*
* @see #getMinimumWidth()
*
* @attr ref android.R.styleable#View_minWidth
*/
public void setMinimumWidth(int minWidth) {
mMinWidth = minWidth;
requestLayout();
}
虽然从注释上看,只是尽量满足view的宽度会向设置的大小靠拢,并不保证所有情况,但是对于仅仅是改造原本就不复杂的布局而言还是能够保证实现的效果的。于是就有了最开始的解决方案。目前来说运行效果良好,兼容性也不错。