我在RecyclerView
方法内将OnCreateView
的填充方法分为几个片段,然后将它们定向到填充提要的适配器(取决于context
的Fragment
)。
目前,我正在为Feed上的用户向上传的图片添加标签。这些标签需要一个x
和y
值(位置),该值是容器的百分比(容器在上载时设置并保存到BaaS中)。目前,像素到百分比的公式非常有效,但是当我尝试获取容器的尺寸时,我每次都尝试过returns 0
的每个选项。
RecyclerViewHolderAllFeeds(View view) {
...
this.imageContainer = (RelativeLayout) view
.findViewById(R.id.image_container);
}
标记片段:
(在bind内部调用此函数,以将所有标签绑定到上载的图像)
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);
我现在在OnCreateViewHolder方法中设置containerWidth的值:
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(ViewHolderholder)方法:
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&Height:0.0 0.0
E / getPointX&Y:70.13 88.00
E / x:x 0.0 y 0.0
在其他地方初始化布局并收集信息并将其存储在某个地方是否可以解决?我已经用尽了很多选择。我只是觉得我对SO社区中的
Fragments
和RecyclerViews
知之甚少。任何帮助将不胜感激。
最佳答案
正如@Enzokie提到的那样,您必须在知道x
的宽度和高度之后,才能在回调中计算y
和imageContainer
。因此,您所需要做的就是将OnGlobalLayoutListener
移至onBindViewHolder
方法,如下所示:
@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();
}
});
...
}
希望有帮助!