- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
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/
Tôi có một ngăn xếp phân đoạn như thế này F1 -> F2 -> F3 -> F4 -> F5 Bây giờ tôi cần xóa các đoạn F2, F3, F4. Tôi cần nếu tôi nhấn lại từ lần nhấn đoạn F5
Tôi cần trợ giúp để hiểu cách hoạt động của tình huống sau và cách đạt được kết quả. Tôi có một lớp tên là ShopCart. Nó có một phương thức gọi là addItemsToShoppingCartFromPreviousOrder
Tôi có một đoạn chứa ViewPager. ViewPager này rõ ràng được điền bởi các Fragment khác. Câu hỏi của tôi là có phương pháp nào cho Fragment trong ViewPager (
Vì vậy, tôi đang triển khai FragmentActivity và cố gắng thêm một đoạn nhưng tôi đang gặp phải nhiều vấn đề. Tôi đã từng làm điều này trước đây và tôi thực sự đã sử dụng mã giống như dự án trước đó (nơi nó hoạt động) nhưng vì lý do nào đó nó hoạt động ở đây
Closed. This question needs details or clarity。它当前不接受答案。
Tôi muốn chuyển đổi đoạn Android X (androidx.fragment.app.Fragment) thành đoạn gốc Android (android.app.Fra
Giả sử tôi có một bảng SQLite với 10 cột loại văn bản (20). ListFragment sẽ trích xuất 4 cột từ cơ sở dữ liệu và hiển thị chúng trong danh sách bằng SimpleCursorAdapter. Sau khi lựa chọn, liệt kê
Tôi có một đoạn hộp thoại và tôi đã tạo một lớp để khởi tạo từng phần. Khi tôi hiển thị hộp thoại, nó sẽ hiển thị tốt. Tuy nhiên, khi tôi đóng hộp thoại, nó gặp sự cố vì: đoạn này không liên quan gì đến trình quản lý đoạn. Tôi cũng đã thử
Tôi muốn làm mới đoạn khi trình phân trang Chế độ xem thay đổi thành đoạn. gói com.mcivisoft.rcbeam nhập android.os.Bundle;
Tôi có một Hoạt động tên là MainActivity và tôi đã thêm đoạn "BenefitFragment" vào vùng chứa R.id.mainContainer. Lợi íchFrag
Vì vậy, tôi có ClientListView này, hoạt động rất tốt, hiển thị khách hàng và tôi có thể nhấp vào khách hàng và nhận thông tin chi tiết của họ ở bên phải (trong đoạn thứ hai của tôi). Được xác định theo bố cục ở đây: Điều này hoạt động rất tốt, nhưng sau đó tôi
Tôi đã thử mã này nhưng việc nhấp vào nút trong đoạn đầu tiên không thay đổi giá trị chuỗi trong đoạn thứ hai. Đây là tệp kotlin của đoạn đầu tiên. Nó có hai nút, nhấp vào chúng để thay đổi giá trị chuỗi
Tôi gặp tình huống sau: Tôi mở đoạn A và nhắm mục tiêu, thông qua sự kiện nhấp chuột của nút, đi đến đoạn B. Khi tôi ở đoạn B và nhấp vào nút quay lại (để quay lại đoạn A), tôi muốn chuyển một số tham số cho
Tôi đã tạo một đoạn NavigationDrawer, chứa Trang chủ, Cài đặt, Phản hồi và các mục khác. Mục nhà sẽ mở khi người dùng nhấp vào trang chủ, đó là lúc ứng dụng khởi động.
Tôi đang thay thế 2 đoạn lần lượt, cả hai đoạn đều có menu tùy chọn khác nhau. Khi tôi thay thế đoạn thứ hai, nó cũng hiển thị menu của đoạn đầu tiên. setHasOption
Tôi gặp sự cố: android.app.Fragment$InstantiationException: Không thể khởi tạo đoạn ${packageName}.${a
Tôi đang làm việc về chuyển đổi phân đoạn. Khi tôi thay thế đoạn đầu tiên bằng đoạn thứ hai, nó sẽ xuất hiện bên dưới đoạn đầu tiên. Tôi muốn nó di chuyển lên trên đoạn đầu tiên. tôi nên làm gì
Tôi có tổng cộng 12 mảnh trong ngăn điều hướng. Mỗi mảnh có một phương pháp bóng chuyền. Mỗi đoạn hiển thị phản hồi Volley riêng của nó, ngoại trừ vị trí = 1 và po
Tôi đang sử dụng hai đoạn trong Hoạt động của mình. Ban đầu tôi sẽ thêm một đoạn vào Hoạt động. Sau đó, hãy sử dụng trình nghe trong đoạn đầu tiên. Thay vào đó, tôi muốn sử dụng đoạn thứ hai.
Tôi đang triển khai chương trình "đoạn-101" trong đó tôi thay thế một đoạn khi nhấp vào nút tương ứng. Tuy nhiên, điều sau đây sẽ xảy ra: Tại sao điều này lại xảy ra? Tại sao đoạn ban đầu không được thay thế hoàn toàn? ChínhA
Tôi là một lập trình viên xuất sắc, rất giỏi!