美文网首页临时
RecycleView中ItemView设置大小无效

RecycleView中ItemView设置大小无效

作者: Allenlll | 来源:发表于2020-05-26 11:12 被阅读0次
  • 现象
    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) {
    
    }
  1. ViewHolder创建时attatchToRoot不能传true,否则会报异常IllegalStateException: ViewHolder views must not be attached when created.
  2. ViewHolder创建时需要parent(RecycleView)的LayoutParams信息
  3. 在自定义View中如果attatchToRoot设置为true,则不需要手动调用addView方法,就已经添加到了parent中。否则报java.lang.IllegalStateException: The specified child already has a parent.
  4. 在自定义View中如果parent不为空,attatchToRoot为false,则是为了让自定义View中设置的layout_width和layout_height有效。因为这两个参数只有在有一个容器的时候才会有效。否则自定义View根节点宽高设置无效
  5. 自定义ViewInflate的写法
  private void init(){
        View layout = LayoutInflater.from(getContext()).inflate(R.layout.face_icon_grid, this,true);

相关文章

网友评论

    本文标题:RecycleView中ItemView设置大小无效

    本文链接:https://www.haomeiwen.com/subject/cgemahtx.html