2015-07-19 57 views
3

我无法渲染自定义视图内部回收站视图小部件。传统上,我们内部膨胀的RecylerView.Adapter类似观点在RecyclerView小部件中使用自定义视图

public RowLayoutViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    View view = LayoutInflater.from(context).inflate(R.layout.sample_view, viewGroup, false); 
    RowLayoutViewHolder rowLayoutViewHolder = new RowLayoutViewHolder(view); 
    return rowLayoutViewHolder; 
} 

这工作得很好,我们可以将数据绑定到里面onBindViewHolder(...)方法的看法。但是当我尝试创建ViewGroup的子类并像这样使用时,我得到一个空白(“黑色”)屏幕。

public ImageGalleryAdapter.RowLayoutViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    SampleView view = new SampleView(context); 
    RowLayoutViewHolder rowLayoutViewHolder = new RowLayoutViewHolder(view); 
    return rowLayoutViewHolder; 
} 

这里是我的SampleView类 -

public class SampleView extends ViewGroup { 

    public SampleView(Context context) { 
    super(context); 
    initView(); 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    for (int i = 0; i < getChildCount(); i++) { 
     View child = getChildAt(i); 
     child.layout(l, t, l + 600, t + 200); 
    } 
    } 

    private void initView() { 
    inflate(getContext(), R.layout.sample_view, this); 
    TextView textView = (TextView) findViewById(R.id.sampleTextView); 
    textView.setTextColor(Color.WHITE); 
    textView.setText("Hello from textview"); 
    } 
} 

这里是布局 -

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:orientation="vertical" 
      android:background="@color/white" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

    <TextView 
     android:id="@+id/sampleTextView" 
     android:text="Sample TextView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 
</LinearLayout> 

看着好像充气布局的源代码行为完全一样创建一个视图,除了通胀过程基于rootView将一个合适的LayoutParameter添加到子视图。我试着手动添加,但没有任何结果。

任何帮助将不胜感激。

+0

确实看到了这个问题的任何解决方案,我有类似的问题,因为我用我的回收站视图查看持有人如何在其布局具有自定义视图,当我向后滚动,我滚动快回收视图只是错过了一些平局,并在屏幕上留下了一些前面的项目,从回收商视图 – Sniper

+0

我找到了一个解决方案。因为我错过了那些回滚视图需要在滚动时重新填充所有内容的部分,所以我没有填充我的布局的每个部分,这非常重要,这就是为什么我看到其他子视图的数据。 – Sniper

回答

0

我习惯了最初的方法,所以我不确定发生了什么。 你有没有尝试从onLayout()方法调用initView?

+0

我刚试过,没有工作。仍然看到黑屏。当我在onBindViewHolder(...)方法内调用view.isAttachedToWindow()时,它返回true。 – user1010373

0

我已经成功地解决了一个迂回的方式问题,这可能有助于

自定义视图,说SampleView,在任何你想修改的布局(我猜这里onLayout()),注册

@Override 
    public void onGlobalLayout() { 
     // Do layout stuff here 
    } 

此外,作为一个侧面说明,不要忘记删除GlobalOnLayoutListener befo:

getViewTreeObserver().addOnGlobalLayoutListener(new LayoutViewTreeObserver()) 
在回调LayoutViewTreeObserver

重新进行修改,以便回调不再需要调用(在实践中,我不得不呼叫getViewTreeObserver()而不是保持对观察者的引用,因为很多时候参考停止“活着”,并且在I时抛出错误尝试取消注册)。


虽然我工作上面,我意识到,这是很不理想,因为它依赖于一个事实,即自定义视图通常获得的容器类,而如果使用其他地方会不会RecyclerView的的LayoutParams。 LayoutParams,从而导致错误。但是,我发现在XML中只使用CustomView作为基本标记的XML布局,并且按标准方式膨胀/绑定标准方式。这与RecyclerView如何附加之前完成的视图和测量有关,但我还没有做深入的研究以发现为什么。

0

在你的onCreateViewHolder()尝试设置PARAMS到你创建的视图和宽度设置为parent.getMeasuredWidth()看看是否有帮助,它解决了我的问题。

3

这很简单。如果你看到你通过膨胀来添加视图的方式,你会意识到你将它添加到父视图组(ViewGroup),但不附加它。在这个过程中,会生成默认的LayoutParams并将其设置为您的视图。(Check LayoutInflater source)

SampleView view = new SampleView(context); 
view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 

这是应该怎么做的。甚至以下似乎是工作。

viewGroup.add(view, new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
相关问题