2015-07-19 54 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)); 
相關問題