- 现象
RecycleView中的itemView设置大小没有效果,固定值或者match_parent效果都是wrap_content的效果 - 原因
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GlideViewHolder {
var view = LayoutInflater.from(parent.context).inflate(R.layout.item_recycle_glide,parent,false)
return GlideViewHolder(view)
}
在onCreateViewHolder方法中inflateview时没有传入parent:
var view = LayoutInflater.from(parent.context).inflate(R.layout.item_recycle_glide,null)
- 正确的写法
var view = LayoutInflater.from(parent.context).inflate(R.layout.item_recycle_glide,parent,false)
- 深入思考
/**
* 解析一个新的View
*
* @param resource ID 新View的资源ID
* @param root 可选的 解析出来的新View的ParentView(如果attachToRoot设置为true), 或者只是为新View提供了LayoutParams值 (如果attachToRoot设置为false.)
* @param attachToRoot 如果是false,仅仅为新view提供了roo和LayoutParams值 ,并没有依附于root
*/
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) {
}
- ViewHolder创建时attatchToRoot不能传true,否则会报异常
IllegalStateException: ViewHolder views must not be attached when created.
- ViewHolder创建时需要parent(RecycleView)的LayoutParams信息
- 在自定义View中如果attatchToRoot设置为true,则不需要手动调用addView方法,就已经添加到了parent中。否则报
java.lang.IllegalStateException: The specified child already has a parent.
- 在自定义View中如果parent不为空,attatchToRoot为false,则是为了让自定义View中设置的layout_width和layout_height有效。因为这两个参数只有在有一个容器的时候才会有效。否则自定义View根节点宽高设置无效
- 自定义ViewInflate的写法
private void init(){
View layout = LayoutInflater.from(getContext()).inflate(R.layout.face_icon_grid, this,true);
网友评论