您无法在 getActivity() returns 为空的尚未附加的视图或片段上开始加载。适配器 Class
You cannot start a load on a not yet attached View or a Fragment where getActivity() returns null. Adapter Class
我正在使用 Room DataBase,并且正在尝试将图像粘贴到 RecyclerView 中。但是当我试图将数据检索到适配器 class 时,我得到
You cannot start a load on a not yet attached View or a Fragment where getActivity() returns null (which usually occurs when getActivity() is called before the Fragment is attached or after the Fragment is destroyed).
在其他主题中我看到了 isAdded() 方法,但我不能在 Adapter class
中使用它
这是我来自父类的 clickListener
ARB.contRem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ARB.remText.getText().toString().equals("")){
ARB.err.setText("errCode");
}
else if(ARB.dateFromCalendar.getText().toString().equals("")){
ARB.err.setText("errCode");
}
else {
Bitmap bitmap = ((BitmapDrawable)ARB.addImageRem.getDrawable()).getBitmap();
Uri uri = getImageUri(getContext(), bitmap);
ARVM.addReminder(ARB.remText.getText().toString(),
ARB.dateFromCalendar.getText().toString(),
false,
uri.toString());
Navigation.findNavController(v).popBackStack();
}
}
});
这是来自 AdapterClass
@Override
public void onBindViewHolder(@NonNull reminderViewHolder holder, int position) {
Uri uri = Uri.parse(rems.get(position).getImages());
Glide.with(ct).load(new File(uri.getPath())).into(holder.binding.imageView);
holder.binding.textrow.setText(rems.get(position).getTextRem());
holder.binding.daterow.setText(rems.get(position).getDateRem());
holder.binding.isdone.setChecked(rems.get(position).isDone());
}
这就是我在尝试检索数据后得到的结果
2021-09-23 15:28:10.308 5391-5391/com.example.rempractice E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.rempractice, PID: 5391
java.lang.NullPointerException: You cannot start a load on a not yet attached View or a Fragment where getActivity() returns null (which usually occurs when getActivity() is called before the Fragment is attached or after the Fragment is destroyed).
at com.bumptech.glide.util.Preconditions.checkNotNull(Preconditions.java:29)
at com.bumptech.glide.Glide.getRetriever(Glide.java:769)
at com.bumptech.glide.Glide.with(Glide.java:801)
at com.example.rempractice.project.View.adapters.reminderAdapter.onBindViewHolder(reminderAdapter.java:40)
at com.example.rempractice.project.View.adapters.reminderAdapter.onBindViewHolder(reminderAdapter.java:19)
at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1873)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1873)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:784)
at android.view.View.layout(View.java:22844)
2021-09-23 15:28:10.308 5391-5391/com.example.rempractice E/AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:6389)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3470)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2938)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1952)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8171)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
at android.view.Choreographer.doCallbacks(Choreographer.java:796)
at android.view.Choreographer.doFrame(Choreographer.java:731)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
在这种情况下,我通常会将对主机片段或其上下文的引用传递给适配器构造函数以保留它并在需要时在 Glide 中使用它,如下所示:
public class MyAdapter extends RecyclerView.Adapter<reminderViewHolder > {
private final Fragment hostFragment;
public MyAdapter (Fragment m_hostFragment) {
this.hostFragment = m_hostFragment;
}
...
public void onBindViewHolder(@NonNull reminderViewHolder holder, int position) {
Uri uri = Uri.parse(rems.get(position).getImages());
Glide.with(hostFragment).load( uri).into(holder.binding.imageView);
}
}
当我在我的片段中初始化我的适配器时,我将只传递我的片段引用
public class MyFragment extends Fragment {
...
@Override
public void onViewCreated(@Nullable Bundle savedInstanceState) {
...
MyAdapter pagesAdapter = new MyAdapter (this);
...
}
...
}
更新我们在评论中讨论的内容
这取决于您从 getImages 方法返回的内容。我不知道你在那里返回什么,但你应该一次只返回一个只属于一张图像的字符串。
RecyclerView 是一个列表,每个 row/column 代表一个不同的 holder,对于每个 holder RecyclerView 调用 onBindHolder 来初始化它,如果你想显示多个图像,你应该在不同的 holder 中显示每个,RecyclerView 将多次调用 onBindHolder,直到所有 arraylist 数据都显示在屏幕上。
因此假设如果您的数据 ArrayList 是字符串类型,其中每个项目都包含一个图像 uri 字符串,那么就足以在一个 onBindViewHolder
.
中获取 uri 字符串
public class MyAdapter extends RecyclerView.Adapter<reminderViewHolder>{
private final Fragment hostFragment;
List<String> photos ;
public MyAdapter (Fragment m_hostFragment,List<String> photos) {
this.hostFragment = m_hostFragment;
this.photos = photos;
}
...
public void onBindViewHolder(@NonNull reminderViewHolder holder, int position) {
String photo_Uri = photos.get(position);
Glide.with(hostFragment).load(photo_Uri).into(holder.binding.imageView);
}
@Override
public int getItemCount() {
return photos.size();
}
}
并且您的 RecyclerView 将调用 onBindViewHolder 的次数与 getItemCount returns 一样多,以表示您的所有数据。
我正在使用 Room DataBase,并且正在尝试将图像粘贴到 RecyclerView 中。但是当我试图将数据检索到适配器 class 时,我得到
You cannot start a load on a not yet attached View or a Fragment where getActivity() returns null (which usually occurs when getActivity() is called before the Fragment is attached or after the Fragment is destroyed).
在其他主题中我看到了 isAdded() 方法,但我不能在 Adapter class
这是我来自父类的 clickListener
ARB.contRem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ARB.remText.getText().toString().equals("")){
ARB.err.setText("errCode");
}
else if(ARB.dateFromCalendar.getText().toString().equals("")){
ARB.err.setText("errCode");
}
else {
Bitmap bitmap = ((BitmapDrawable)ARB.addImageRem.getDrawable()).getBitmap();
Uri uri = getImageUri(getContext(), bitmap);
ARVM.addReminder(ARB.remText.getText().toString(),
ARB.dateFromCalendar.getText().toString(),
false,
uri.toString());
Navigation.findNavController(v).popBackStack();
}
}
});
这是来自 AdapterClass
@Override
public void onBindViewHolder(@NonNull reminderViewHolder holder, int position) {
Uri uri = Uri.parse(rems.get(position).getImages());
Glide.with(ct).load(new File(uri.getPath())).into(holder.binding.imageView);
holder.binding.textrow.setText(rems.get(position).getTextRem());
holder.binding.daterow.setText(rems.get(position).getDateRem());
holder.binding.isdone.setChecked(rems.get(position).isDone());
}
这就是我在尝试检索数据后得到的结果
2021-09-23 15:28:10.308 5391-5391/com.example.rempractice E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.rempractice, PID: 5391
java.lang.NullPointerException: You cannot start a load on a not yet attached View or a Fragment where getActivity() returns null (which usually occurs when getActivity() is called before the Fragment is attached or after the Fragment is destroyed).
at com.bumptech.glide.util.Preconditions.checkNotNull(Preconditions.java:29)
at com.bumptech.glide.Glide.getRetriever(Glide.java:769)
at com.bumptech.glide.Glide.with(Glide.java:801)
at com.example.rempractice.project.View.adapters.reminderAdapter.onBindViewHolder(reminderAdapter.java:40)
at com.example.rempractice.project.View.adapters.reminderAdapter.onBindViewHolder(reminderAdapter.java:19)
at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1873)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1873)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:22844)
at android.view.ViewGroup.layout(ViewGroup.java:6389)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:784)
at android.view.View.layout(View.java:22844)
2021-09-23 15:28:10.308 5391-5391/com.example.rempractice E/AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:6389)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3470)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2938)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1952)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8171)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
at android.view.Choreographer.doCallbacks(Choreographer.java:796)
at android.view.Choreographer.doFrame(Choreographer.java:731)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
在这种情况下,我通常会将对主机片段或其上下文的引用传递给适配器构造函数以保留它并在需要时在 Glide 中使用它,如下所示:
public class MyAdapter extends RecyclerView.Adapter<reminderViewHolder > {
private final Fragment hostFragment;
public MyAdapter (Fragment m_hostFragment) {
this.hostFragment = m_hostFragment;
}
...
public void onBindViewHolder(@NonNull reminderViewHolder holder, int position) {
Uri uri = Uri.parse(rems.get(position).getImages());
Glide.with(hostFragment).load( uri).into(holder.binding.imageView);
}
}
当我在我的片段中初始化我的适配器时,我将只传递我的片段引用
public class MyFragment extends Fragment {
...
@Override
public void onViewCreated(@Nullable Bundle savedInstanceState) {
...
MyAdapter pagesAdapter = new MyAdapter (this);
...
}
...
}
更新我们在评论中讨论的内容
这取决于您从 getImages 方法返回的内容。我不知道你在那里返回什么,但你应该一次只返回一个只属于一张图像的字符串。
RecyclerView 是一个列表,每个 row/column 代表一个不同的 holder,对于每个 holder RecyclerView 调用 onBindHolder 来初始化它,如果你想显示多个图像,你应该在不同的 holder 中显示每个,RecyclerView 将多次调用 onBindHolder,直到所有 arraylist 数据都显示在屏幕上。
因此假设如果您的数据 ArrayList 是字符串类型,其中每个项目都包含一个图像 uri 字符串,那么就足以在一个 onBindViewHolder
.
public class MyAdapter extends RecyclerView.Adapter<reminderViewHolder>{
private final Fragment hostFragment;
List<String> photos ;
public MyAdapter (Fragment m_hostFragment,List<String> photos) {
this.hostFragment = m_hostFragment;
this.photos = photos;
}
...
public void onBindViewHolder(@NonNull reminderViewHolder holder, int position) {
String photo_Uri = photos.get(position);
Glide.with(hostFragment).load(photo_Uri).into(holder.binding.imageView);
}
@Override
public int getItemCount() {
return photos.size();
}
}
并且您的 RecyclerView 将调用 onBindViewHolder 的次数与 getItemCount returns 一样多,以表示您的所有数据。