2016-11-11 82 views
0

我在幾個片段中調用OnCreateView方法中RecyclerView方法的RecyclerView的填充方法,然後將它們定向到爲其填充提要的適配器(取決於Fragmentcontext)。getWidth()&getHeight()在RecyclerView/Fragment中返回0

當前,我正在向Feed上的用戶上傳的圖片添加標籤。這些標籤需要一個xy值(位置),其中是容器的百分比(在上載時將其設置並保存到BaaS)。目前,百分比公式的像素工作正常,但是當我嘗試抓取容器的尺寸時,每次我都嘗試過returns 0

RecyclerViewHolderAllFeeds(View view) { 
    ... 
    this.imageContainer = (RelativeLayout) view 
       .findViewById(R.id.image_container); 
} 

標籤段: (此功能被稱爲綁定內,結合所有的標籤上傳的圖片)

float x = containerWidth - Float.parseFloat(model.getXpoints(o))/100 * containerWidth; 
      float y = containerHeight - Float.parseFloat(model.getYpoints(o))/100 * containerHeight; 
      Log.e("measuredWidth", "" + containerHeight + "" + containerWidth); 
      Log.e("getPointX", "" + model.getXpoints(o) + "" + model.getYpoints(o)); 
      Log.e("x", "x" + x + "y" + y); 
      tag.setX(x); 
      tag.setY(y); 

我設置containerWidth值在OnCreateViewHolder方法的那一刻:

RecyclerViewHolderAllFeeds holder = null; 
    LayoutInflater mInflater = LayoutInflater.from(viewGroup.getContext()); 
    if (viewType == 1) { 
     // This method will inflate the custom layout and return as viewholde 
     ViewGroup mainGroup = (ViewGroup) mInflater.inflate(R.layout.feed_and_search_feed_item_row, viewGroup, false); 
     holder = new RecyclerViewHolderAllFeeds(mainGroup); 
     containerWidth = getContainerWidth(holder); 
     containerHeight = getContainerHeight(holder); 
    } else { 
     ViewGroup mainGroup = (ViewGroup) mInflater.inflate(R.layout.progress_item, viewGroup, false); 
     holder = new ProgressViewHolder(mainGroup); 
    } 
    return holder; 

我也曾嘗試onViewAttchedToWindow方法中這樣說:

@Override 
    public void onViewAttachedToWindow(RecyclerViewHolderAllFeeds holder) { 
     super.onViewAttachedToWindow(holder); 
     containerWidth = getContainerWidth(holder); 
     containerHeight = getContainerHeight(holder); 
    } 

但是再次xy值等於零。

GetContainerWidth(ViewHolder持有者)方法:

float getContainerWidth(final RecyclerViewHolderAllFeeds h) { 
     final int[] width = new int[1]; 
     final ViewTreeObserver observer = h.imageContainer.getViewTreeObserver(); 
     observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       width[0] = h.imageContainer.getWidth(); 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
        h.imageContainer.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
       } else { 
        h.imageContainer.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       } 
      } 
     }); 
     return width[0]; 
    } 

相同的邏輯被施加到getContainerHeight(ViewHolder holder)方法。

我也嘗試過沒有樹觀察器上的全局偵聽器和preDraw參數上的偵聽器。

observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
      @Override 
      public boolean onPreDraw() { 
       height[0] = h.imageContainer.getHeight(); 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
        h.imageContainer.getViewTreeObserver().removeOnPreDrawListener(this); 
       } 
       return false; 
      } 
     }); 

日誌:

E/measuredWidth可以&高度:0.0 0.0
E/getPointX & Y:70.13 88.00
E/X:X 0.0是0.0

關於在其他地方初始化佈局並收集信息並將其存儲在某個地方,是否可以解決一些問題?我用盡了很多選擇。我只是覺得我在SO社區的FragmentsRecyclerViews附近沒有看到足夠的東西。

任何幫助將不勝感激。

+0

'addOnGlobalLayoutListener'不以線性執行,您需要等待它的回調。 – Enzokie

+0

但是,當我需要高度和寬度(在ViewHolder已被綁定爲前幾個項目之後)時,回調時間太遲,您會推薦其他任何東西嗎? – BIW

+0

你需要在回調中執行你的數學邏輯,那也是唯一可以操縱視圖的地方(如果有必要的話)。 – Enzokie

回答

2

由於@Enzokie提到你算算你的xy內回調,你會知道寬度和高度的imageContainer後。因此,所有你需要的是將你的OnGlobalLayoutListeneronBindViewHolder方法,像這樣:

@Override 
public void onBindViewHolder(RecyclerViewHolderAllFeeds h, int position) { 
    ... 
    final ViewTreeObserver observer = h.imageContainer.getViewTreeObserver(); 
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
       h.imageContainer.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } else { 
       h.imageContainer.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } 

      int containerWidth = h.imageContainer.getWidth(); 
      int containerHeight = h.imageContainer.getHeight(); 
      float x = containerWidth - Float.parseFloat(model.getXpoints(o))/100 * containerWidth; 
      float y = containerHeight - Float.parseFloat(model.getYpoints(o))/100 * containerHeight; 
      Log.e("measuredWidth", "" + containerHeight + "" + containerWidth); 
      Log.e("getPointX", "" + model.getXpoints(o) + "" + model.getYpoints(o)); 
      Log.e("x", "x" + x + "y" + y); 

      h.tag.setX(x); 
      h.tag.setY(y); 
      h.tag.requestLayout(); 
     } 
    }); 
    ... 
} 

希望幫助!

+0

感謝您抽出時間,我一定會測試一下。 – BIW

+0

完美地工作,謝謝。 – BIW

+0

不客氣! – rom4ek

相關問題