2017-01-11 53 views
5

我打算實現具有可變項的高度不換正確

enter image description here

項目視圖中應占有該項目的整個高度

enter image description here

它可能什麼水平RecyclerView是物品高度小於回收站視圖中最高物品的高度,在這種情況下,它應該像頂部一樣粘到頂部在上面的截圖中。

我運行蟲子放入

enter image description here

如上面的截圖中,觀點越來越被截斷。

什麼我試過到目前爲止

起初我WRAP_CONTENT去上recyclerview,現在,它是支持的。當屏幕上當時沒有任何可見的視圖是最高的時候,它不起作用。這對於視圖層次結構的佈局是有意義的。 如果高度取決於數據,那麼如何計算尚未綁定到任何數據的東西的高度?

解決方法時間:秒

,而不是試圖自定義佈局管理器,我第一次去什麼,我覺得需要做 - 奠定了開頭的所有項意見,以找出他們的身高。

在屏幕的上半部分有一個進度條和一個動畫,以吸引用戶的注意力,而這一切都發生在recyclerview可見性設置爲不可見的情況下。我使用了兩件事,一件不足 - 我在適配器的onViewAttached()調用中附加了一個觀察者,我也使用了滾動更改偵聽器。有一個LinearSnapHelper連接到回收站視圖,以便在滾動時捕捉鄰近(根據滾動方向的下一個或上一個)位置。

在此設置中,

  1. 我使用layoutManager.smoothScrollToPosition()
  2. 獲取在滾動變化監聽使用

     View currentChildView = binding.nextRv.getChildAt(layoutManager.findFirstCompletelyVisibleItemPosition()); 
         if (currentChildView != null) { 
          currentChildHeight = currentChildView.getHeight(); 
         } 
    

子視圖的高度要在recyclerview每個位置在RecyclerView.SCROLL_STATE_IDLE上或通過將高度傳遞給適配器的onVie中的上述觀察者wAttachedToWindow()

@Override 
public void onViewAttachedToWindow(BindingViewHolder holder) { 
    if (mObserver != null) { 
     mObserver.onViewAttached(holder.binding.getRoot().getHeight()); 
    } 
} 
  • 存儲一個maxHeight改變到maxHeight的最大和新的孩子的高度。
  • 很明顯,這很醜陋。另外,它不會給我當前視圖的高度 - onAttached意味着它只是附加,沒有測量和佈局。它是回收視圖,而不是綁定到當前數據項的視圖。其中存在諸如上面所示的截斷視圖的問題。


    我也試過在回收視圖WRAP_CONTENT高度,從回收的母公司,直到回收和即將SCROLL_STATE_IDLE上滾動的孩子無效。不起作用。


    我不確定自定義佈局管理器如何在這裏提供幫助。

    有人可以引導我在正確的方向嗎?

    +0

    可以添加XML文件 – Redman

    +0

    請找到[這裏](https://gist.github.com/adroitandroid/85e7a66d7f796379649c2d9eab26cf76) –

    +0

    有問題的recyclerview是一個ID爲「next_rv」。其實對於上面詳述的解決方案,最初我已將它設置爲高度match_parent,然後將高度重置爲獲得的maxHeight –

    回答

    1

    適配器在哪裏可以找到裏面兩兩證一頂部,另一個在底部

    如何,我會定義我的佈局是這樣的:

    Cardview1 
    
        LinearLayout1 --> orientation vertical 
    
        cardview2 (Top card where text is written) 
    
        Linearlayout2 (where I can see icons such as like etc)-->orientation horizontal 
    

    通過設置現在固定Linearlayout2的高度它包裝內容。

    而且cardview2的高度應0dp並添加權重= 1

    現在內部cardview2添加TextView1在高度和寬度matchparent。

    更好的內部textview1添加ellipsize到另一端,如果你想顯示所有行添加最大線

    試圖找到autoresizetextview庫可以在這裏創建 - >AutoResizeTextView

    希望它能幫助。

    +0

    感謝您的回答。 Ellipsize是解決它的辦法,它不能解決我的查詢。我知道關於autoresizetextview :)但我不在我的列表上尋找可變字體大小。 –

    3

    我無法接受@Pradeep Kumar Kushwaha的回答,因爲對於一種解決方案,我不希望列表中包含不同的字體大小。一致性是設計中的關鍵要素。他給的第二種選擇無法工作,因爲使用橢圓大小我需要給用戶一些「更多」按鈕來閱讀整個內容,而我的文本視圖已經在進行點擊操作。把一些地方會再次不是好的設計。

    當最高的被截斷的項目變得焦點時,通過調整recyclerview的大小來改變設計,它變成了notifyItemChanged()的簡單用例。即使我使用視圖附加的觀察者和滾動狀態監聽器進行的嘗試,也可以使用notifyItemChanged,但是這種方法太過於黑客。這我可以在代碼和設計中生活。這裏需要的代碼。

    @Override 
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
        if (newState == RecyclerView.SCROLL_STATE_IDLE) { 
         int position = ((LinearLayoutManager) binding.nextRv.getLayoutManager()) 
           .findFirstVisibleItemPosition(); 
         if (position != nextSnippetAdapter.getItemCount() - 1) { 
          binding.nextRv.getAdapter().notifyItemRangeChanged(position, 2); 
         } else { 
          binding.nextRv.getAdapter().notifyItemChanged(position); 
         } 
        } 
    } 
    

    對於我的特殊設置,只需調用這兩個元素即可。它可以進一步優化,以便在大多數情況下在position + 1處調用單個元素,並在角落(文字)情況下檢查並調用適當的元素。

    +0

    這是一個設計的妥協,因爲屏幕上的東西將不得不移動到整個項目的焦點(使用'binding.contentScrollView.fullScroll(ScrollView.FOCUS_DOWN);') –

    +0

    其實它並不是一個大的設計妥協。如果我不滾動滾動視圖底部,事情看起來很好。可以感覺到視圖已經增加並且溢出了屏幕,因此可以期望用戶滾動以查看整個事情。 –