![](/img/trans.png)
[英]Add items within nested list within nested recyclerview in a 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.