我在幾個片段中調用OnCreateView
方法中RecyclerView
方法的RecyclerView
的填充方法,然後將它們定向到爲其填充提要的適配器(取決於Fragment
的context
)。getWidth()&getHeight()在RecyclerView/Fragment中返回0
當前,我正在向Feed上的用戶上傳的圖片添加標籤。這些標籤需要一個x
和y
值(位置),其中是容器的百分比(在上載時將其設置並保存到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);
}
但是再次x
和y
值等於零。
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社區的Fragments
和RecyclerViews
附近沒有看到足夠的東西。
任何幫助將不勝感激。
'addOnGlobalLayoutListener'不以線性執行,您需要等待它的回調。 – Enzokie
但是,當我需要高度和寬度(在ViewHolder已被綁定爲前幾個項目之後)時,回調時間太遲,您會推薦其他任何東西嗎? – BIW
你需要在回調中執行你的數學邏輯,那也是唯一可以操縱視圖的地方(如果有必要的話)。 – Enzokie