2015-10-19 53 views
3

RecyclerView裏面有一些關於RecyclerView的話題,但是我看到其中大部分都不適合我的情況。我的情況是我有一個RecyclerView(垂直線性佈局管理)顯示CardView的列表,每個Cardview包含一個內部RecyclerView(水平線性佈局管理)。問題在於滾動時的性能,它根本不是光滑的。我注意到,如果我對Inner Recyclerview的setAdapter發表評論,scrooling會變得流暢,但是我會使CardView不會更新新列表。該代碼是類似於此:RecyclerView裏面的RecyclerView不順利

onBindViewHolder...{ 
    holder.innerRecycler.setAdapter(new InnerAdapter((data)); 
    // comment that line make the outer recyclerview smoothly but the CardView data not updated thanks to the view recycling. 
} 

我知道一個滾動視圖內滾動視圖是不是一個好主意,但我沒有看到任何其他的選擇。任何人在面對這種佈局之前?謝謝。

UPDATE(添加更多代碼)。

// init outer recyclerview 
mOuterRecyclerView = (RecyclerView) findViewById(...); 
mOuterRecyclerView.setLayoutManagement(new LinearLayoutManagement(this)); 
mOuterRecyclerView.setHasFixedSize(true); 
mOuterRecyclerView.setAdapter(new OuterAdapter(dataList)); 

// The adapter class for the outer one 
onBindViewHolder(...){ 
    final dataItem = mItems.get(position); 
    holder.innerRecycler.setAdapter(new InnerAdapter(dataItem.getList())); 
} 

// the holder for the outer 
class MyHolder extends ViewHolder{ 
    RecyclerView innerRecycler; 
    public MyHolder(View view){ 
     super(..); 
     innerRecycler = findViewById(...); 
    } 
} 
// the adapter for the inner 
onBindViewHolder(...){ 
    final dataItem = mItems.get(pos); 
    // async loading 
    holder.tvTitle.setText(dataItem.getTitle); 
} 

佈局非常簡單,所以我不在這裏發佈完整的代碼。 :)

+1

是的,你是對的,這是一個非常糟糕的做法,它會降低性能並影響用戶體驗。我建議你將內部'RecyclerView'的內容移動到其他地方,可能是點擊或新窗口時的彈出窗口。 至於你的問題,我們不能在沒有看到你究竟做什麼的情況下調試它 – Droidman

+0

@Droidman。這就是我所想的,但我想看看是否有人能夠以最佳性能歸檔這種佈局。 :)。感謝您的建議 – Paul

+0

您需要發表更多代碼 – ligi

回答

2

只要沿着不同的座標軸滾動,這種方法就沒有問題。您可以啓用RecyclerView.startNestedScroll(int),並且還可以處理像overscroll這樣的情況。這種延遲會是因爲您每次都要重新啓動一個adpater。你可以嘗試一些不同的東西,例如維護adpaters的地圖,並在bindVH中調用RecyclerView.swapAdapter(args...)

使用RecyclerView.setRecycledViewPool(args...)的另一個好的步驟也可以使用公共池來回收視圖。 我已經創建並使用了一個具有嵌套(不同軸)回收器的超過100個物品的列表,並且沒有遇到問題。

如果你想提供更多的代碼(你寫的地方async loading),我可以幫助你更多。但我建議你通過API和設計模式,並應該解決你的問題。

+0

swapAdapter做到了。雖然動畫不像預期的那樣平滑,但我將其標記爲答案。謝謝。 :) – Paul

+0

'平滑'將取決於你的綁定方法是如何。優化保持應該做的伎倆。 – Droidekas

+0

這很有道理。外部適配器的onBind方法很快(總是0ms),但內部的onBind需要相當長的時間(1 - 5ms,有時需要長達20ms)。我想這是外滾動的問題,但內滾動非常平滑。 ? – Paul

0

既然有一些用戶問我如何存檔,我會發布我的工作。 @Droidekas似乎是一個好點,但我不這樣做。

我所做的是:

  1. 每個水平回收的觀點是垂直回收視圖

  2. 當我需要爲特定垂直項的數據(onBindViewHolder)的項目,我使用水平回收站適配器setNotifyDataSetChanged而不是設置一個全新的適配器或交換它。這樣,我就可以很順利地進行垂直回收。

垂直recyler適配器結構可能是:

Vertical Item view holder -> Vertical Item[Name, List<Horizontal item>,...] 
Vertical Item view holder -> Vertical Item[Name, List<Horizontal item>,...] 

在OnBindViewHolder

holder.setData(VerticalItem) 

在持有人,我有一個SetData方法是這樣的:

setData(VerticalItem item){ 
    mItems = item.getHorizontalItems(); 
    mHorizontalAdapter.notifyDataSetChanged(); 
} 

希望能幫助到你。 :D

1

@Paul我有同樣的要求,下面的技巧奏效。 將父級recyclerview放入NestedScrollView和onCreate方法中,設置爲 。

mRecyclerView.setHasFixedSize(true); 
mRecyclerView.setNestedScrollingEnabled(false); 

這可以防止父回收站的滾動和滾動變得絕對平滑。

相關問題