簡體   English   中英

具有任何深度的嵌套項目的 Recyclerview

[英]Recyclerview with nested items of any depth

我需要顯示一個可以有任意數量的副標題的 Recyclerview。 可悲的是,我只找到了支持深度為 1 的解決方案。 這對我的情況來說還不夠。

我可以有這樣的東西:

Heading 1
  Subheading 1
    Subsubheading 1
      Subsubsubheading 1
  Subheading 2
Heading 2
...

你明白了。 此外,如果用戶可以像在 MS Word 中一樣擴展這些標題及其內容,這也將非常有用。 如何實現這種行為(如果可能沒有外部庫)? 感謝您的支持!

對於這個問題,一個RecyclerView應該就足夠了。 您的Adapter項目應該有一個包含節點深度和子節點的樹結構。 然后,可以根據每個項目的深度填充其對應的視圖進行更改。

讓我們考慮一個簡單的例子 - 有一個名為File的數據 class 如下:

public class File {
    ...
    public final List<File> children = new ArrayList();
    public boolean isExpanded;
    public boolean isFolder;
    // THIS MUST BE NON-NEGATIVE
    public int depth; 
    ...
}

然后RecyclerView.Adapter (最初你應該將根文件列表傳遞給它):

...
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    File file = files.get(position);

    holder.itemView.setPadding(Math.min(depth, <MAX_PADDING>) * <leftPadding>, 0, <rightPadding>, 0);

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (file.isFolder) {
                if (!file.isExpanded) {
                    expand(holder, file);
                } else {
                    // if you wanna collapse the folder then I'll leave it up to you :)
                } 
            }
        }
    });
}

private void expand(ViewHolder holder, File file) {
    file.isExpanded = true;
    int start = holder.getAdapterPosition();
    files.addAll(start + 1, file.children);
    notifyItemRangeInserted(start + 1, file.children.size());
}
...

如果你想實現collapse ,那么它有點棘手(你必須計算應該從列表中刪除的正確項目數),但我會留給你。

我最終使用了 user3170251 和我自己的方法的組合。 因為我的標頭來自不同的模型,所以我使用了一個接口,所有模型都實現了該接口。

recyclerview 只獲取實現該接口的對象列表。 通過檢查當前元素的類型,它知道它是只讀的 header 還是具有特殊點擊功能的普通元素。 現在,要擁有某種層次結構,您需要將深度存儲在 model 本身中。 因此,recyclerview 看到的數據層次結構仍然是一個平面列表,但是通過將深度保存在 model 本身中,我可以為深度更深的標題提供更小的字體大小。

Anshul Aggarwal 關於RecyclerView 是否有一個 addHeaderView 等價物的答案? 真的幫了我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM