溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android中RecyclerView顯示Item布局不一致怎么辦

發(fā)布時(shí)間:2021-07-14 09:22:44 來(lái)源:億速云 閱讀:118 作者:小新 欄目:移動(dòng)開(kāi)發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)Android中RecyclerView顯示Item布局不一致怎么辦,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

RecyclerView顯示Item布局不一致

在自定義RecyclerAdapter的時(shí)候,在重寫onCreateViewHolder方法是使用了

 @Override
  public H onCreateViewHolder(ViewGroup parent, int viewType) {
    View view=View.inflate(context,layoutId,null);
    return view;
  }

進(jìn)行生成布局,結(jié)果發(fā)現(xiàn)生成的布局沒(méi)有LayoutParams。以前自定義View的時(shí)候發(fā)現(xiàn),LayoutParams是由于ViewGroup生成的,因?yàn)檫@里添加的ViewGroup為null。所以并不會(huì)生成LayoutParams。結(jié)果在RecyclerView的getViewForPosition方法中檢查了有沒(méi)有LayoutParams如果沒(méi)有的話就調(diào)用LayoutManager的generateDefaultLayoutParams生成默認(rèn)的LayoutParames。代碼段如下:

 final ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
      final LayoutParams rvLayoutParams;
      if (lp == null) {
        rvLayoutParams = (LayoutParams) generateDefaultLayoutParams();
        holder.itemView.setLayoutParams(rvLayoutParams);
      } else if (!checkLayoutParams(lp)) {
        rvLayoutParams = (LayoutParams) generateLayoutParams(lp);
        holder.itemView.setLayoutParams(rvLayoutParams);
      } else {
        rvLayoutParams = (LayoutParams) lp;
      }

而在LinearLayoutManager中g(shù)enerateDefaultLayoutParams方法實(shí)現(xiàn)如下。

/**
   * {@inheritDoc}
   */
  @Override
  public LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
        ViewGroup.LayoutParams.WRAP_CONTENT);
  }

最終會(huì)造成RecycleView的顯示效果與布局文件不一致。后來(lái)使用了LayoutInflater來(lái)填充布局。

@Override
  public H onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = mInflater.inflate(layoutId, parent, false);
    return getInstanceOfH(view);
  }

查看LayoutInflater源碼發(fā)現(xiàn)inflate最后的參數(shù)如果是false的話就不會(huì)將生成的View添加到parent。但是會(huì)根據(jù)parent產(chǎn)生相應(yīng)的LayoutParams 。源碼如下:

* @param attachToRoot Whether the inflated hierarchy should be attached to
   *    the root parameter? If false, root is only used to create the
   *    correct subclass of LayoutParams for the root view in the XML.

因?yàn)樵趏nCreateViewHolder中產(chǎn)生的View不能由我們手動(dòng)添加到RecycleView中所以最后的參數(shù)只能是false;

關(guān)于“Android中RecyclerView顯示Item布局不一致怎么辦”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI