cuốn sách gpt4 ai đã làm

android - Thêm đoạn trong RecyclerView.ViewHolder

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 18:55:45 hai mươi bốn 4
mua khóa gpt4 Nike

Tôi có RecyclerView.ViewHolder bổ sung các đoạn khác nhau vào FrameLayout dựa trên phiên bản đối tượng được truyền. Vấn đề là hầu như không thể thêm đoạn này vào ViewHolder. Xin lưu ý rằng tôi đã chuyển FragmentManager từ cấp độ gốc. Ban đầu tôi đã thử sử dụng mã này

public void setSomething(boolean A) {
nếu (A) {
mFragmentManager.beginTransaction()
.replace(mBinding.typeContainerLayout.getId(), FragmentA() mới)
.làm();
} khác {
mFragmentManager.beginTransaction()
.replace(mBinding.typeContainerLayout.getId(), FragmentB() mới)
.làm();
}
}

Vấn đề với mã này là tất cả các ViewHolder đều có chung một id, vì vậy chỉ một ViewHolder mới có thể thêm đoạn này. Trong RecyclerView của tôi, chỉ ô đầu tiên được thêm đoạn. Để giải quyết vấn đề này tôi đã tạo một FrameLayout khác và thêm nó vào loạiContainerLayout ở giữa. Bây giờ mã của tôi trở nên như thế này.

public void setSomething(boolean A) {
FrameLayout frameLayout = new FrameLayout(mContext);
frameLayout.setId(View.generateViewId());
mBinding.typeContainerLayout.removeAllViews();
mBinding.typeContainerLayout.addView(frameLayout)

nếu (A) {
mFragmentManager.beginTransaction()
.replace(frameLayout.getId(), FragmentA() mới)
.làm();
} khác {
mFragmentManager.beginTransaction()
.replace(frameLayout.getId(), FragmentB mới())
.làm();
}
}

Bây giờ mỗi ViewHolder đều có đoạn được thêm chính xác và có đoạn riêng. Tuy nhiên, vấn đề xảy ra khi tôi thêm 5 ViewHolders và cố gắng cuộn xuống RecyclerView, xảy ra lỗi thời gian chạy, trạng thái

java.lang.IllegalArgumentException: Không tìm thấy chế độ xem cho id 0x4 (không xác định) cho đoạn FragmentA{7c55a69 #0 id=0x4 FragmentA}
tại android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1292)
tại android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323)
tại android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136)
tại android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092)
tại android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1998)
tại android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:709)
tại android.os.Handler.handleCallback(Handler.java:739)
tại android.os.Handler.dispatchMessage(Handler.java:95)
tại android.os.Looper.loop(Looper.java:148)
tại android.app.ActivityThread.main(ActivityThread.java:5417)
tại java.lang.reflect.Method.invoke (Phương thức gốc)
tại com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
tại com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Tôi đoán là các id xung đột tại một số điểm hoặc Chế độ xem bị hỏng do chế độ ViewHolder. Vì vậy, câu hỏi của tôi là.

1) Có giải pháp nào không?

2) Có cách nào tốt hơn việc thêm đoạn. Lý do tôi thêm đoạn này là để logic cho phần tử con của ViewHolder có thể nằm trong một đoạn duy nhất. Tất nhiên, tôi có thể đặt cả hai Chế độ xem của đoạn vào ViewHolder xml. Và chỉ setVisible() tùy thuộc vào điều kiện. Nhưng điều này chỉ khiến ViewHolder của tôi chứa quá nhiều logic.

Trong trường hợp có ai đó bối rối về lý do tại sao tôi cần mảnh vỡ. Đây là những gì tôi muốn đạt được. Hình ảnh

câu trả lời hay nhất

Bạn nên biết chính xác rằng Recyclerview tạo chủ sở hữu của bạn và vẽ Chế độ xem cho anh ta, vì vậy bạn cần thực hiện điều đó trong bộ điều hợp onViewAttachedToWindow Đính kèm một đoạn vào phương thức. Trong phương pháp "đính kèm đoạn" của mình, bạn nên kiểm tra xem trình quản lý đoạn đã chứa các đoạn này chưa để ngăn việc tạo nhiều phiên bản.

bộ chuyển đổi:

 ghi đè niềm vui onViewAttachedToWindow(holder: RecyclerView.ViewHolder) {    
if(holder là FragmentsHolder){
AttachFragmentToContainer(holder.flContainer)
}
super.onViewAttachedToWindow(holder)
}

Phương pháp thực hiện:

 vui vẻ đính kèmFragmentToContainer(containerId: Int) {
đoạn val = if (fragmentManager?.fragments?.firstOrNull { đó là YourFragment } == null)
YourFragment.instance()
khác
null

if (đoạn != null) {
FragmentManager?.beginTransaction()
?.add(containerId, đoạn)
?.commitNowAllowingStateLoss()
}
}

Điều này đã được thử nghiệm trên một số lượng lớn người dùng - không gặp sự cố, hiệu suất tốt.

Về android - thêm đoạn trong RecyclerView.ViewHolder, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/42205827/

hai mươi bốn 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress