导航后未附加回收站视图
Posted
技术标签:
【中文标题】导航后未附加回收站视图【英文标题】:Recycler view is not attached after navigation 【发布时间】:2018-10-29 16:58:41 【问题描述】:我正在开发这个应用程序,我使用了底部导航视图。在我的家庭片段上,我使用了两个回收站视图。我正在获取一些数据和图像以显示在主屏幕片段上。在应用程序启动时,图像在两个回收器视图中都可见,但如果我旋转屏幕或导航到其他片段,图像将从第二个回收器视图中消失,而第一个回收器视图仍在显示图像。
下面是代码
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
mFavSubCatDatabase =
FirebaseDatabase.getInstance().getReference().child("FavSubCat");
mFavSubCatDatabase.keepSynced(true);
mFavCatDatabase =
FirebaseDatabase.getInstance().getReference().child("FavCat");
mFavCatDatabase.keepSynced(true);
// mLayoutManager = new LinearLayoutManager(getContext());
RecyclerView.LayoutManager mLayoutManager = new
GridLayoutManager(getContext(), 3);
mFavSubCatList = (RecyclerView)
view.findViewById(R.id.HomesubcatOpeningRecler);
mFavSubCatList.setHasFixedSize(true);
mFavSubCatList.setLayoutManager(mLayoutManager);
LinearLayoutManager mLayoutManager2
= new LinearLayoutManager(getContext(),
LinearLayoutManager.HORIZONTAL, false);
mFavCatList = (RecyclerView)
view.findViewById(R.id.HomeCatRecyclerOpening);
mFavCatList.setHasFixedSize(true);
mFavCatList.setLayoutManager(mLayoutManager2);
return view;
@Override
public void onStart()
super.onStart();
startListening();
public void startListening()
Query query = FirebaseDatabase.getInstance()
.getReference()
.child("FavCat")
.limitToLast(50);
FirebaseRecyclerOptions<HomeCatitems> options =
new FirebaseRecyclerOptions.Builder<HomeCatitems>()
.setQuery(query, HomeCatitems.class)
.build();
FirebaseRecyclerAdapter adapter = new
FirebaseRecyclerAdapter<HomeCatitems, CategoryViewHolder>(options)
@Override
public CategoryViewHolder onCreateViewHolder(ViewGroup parent, int
viewType)
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.home_cat_layout, parent, false);
return new CategoryViewHolder(view);
@Override
protected void onBindViewHolder(final CategoryViewHolder holder, int
position, final HomeCatitems model)
holder.setDisplayName(model.getName());
holder.setUserImage(model.getImageUrl(), getContext());
;
mFavCatList.setAdapter(adapter);
adapter.startListening();
Query query1 = FirebaseDatabase.getInstance()
.getReference()
.child("FavSubCat")
.limitToLast(50);
FirebaseRecyclerOptions<CategoryItems> options1 =
new FirebaseRecyclerOptions.Builder<CategoryItems>()
.setQuery(query1, CategoryItems.class)
.build();
FirebaseRecyclerAdapter adaptersubcat = new
FirebaseRecyclerAdapter<CategoryItems, SubCategoryViewHolder>(options1)
@Override
public SubCategoryViewHolder onCreateViewHolder(ViewGroup parent,
int viewType)
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.home_subcat_items, parent, false);
return new SubCategoryViewHolder(view);
@Override
protected void onBindViewHolder(final SubCategoryViewHolder holder,
int position, final CategoryItems model)
holder.setDisplayName(model.getName());
holder.setUserImage(model.getImageUrl(), getContext());
;
mFavSubCatList.setAdapter(adaptersubcat);
adaptersubcat.startListening();
下面给出了内部 viewHolder 类之一 公共静态类 SubCategoryViewHolder 扩展 RecyclerView.ViewHolder
View mView;
ImageView subcategoryImageView;
TextView subcategoryName;
public SubCategoryViewHolder(View itemView)
super(itemView);
mView = itemView;
public void setDisplayName(String name)
subcategoryName = (TextView)
mView.findViewById(R.id.home_subcat_name);
subcategoryName.setText(name);
public void setUserImage(final String thumb_image, final Context ctx)
subcategoryImageView = (ImageView)
mView.findViewById(R.id.home_subcat_image);
Picasso.with(ctx).setIndicatorsEnabled(false);
Picasso.with(ctx).load(thumb_image).networkPolicy(NetworkPolicy.OFFLINE)
.placeholder(R.drawable.default_avatar).into(subcategoryImageView, new
Callback()
@Override
public void onSuccess()
@Override
public void onError()
Picasso.with(ctx).load(thumb_image).placeholder(R.drawable.default_avatar)
.into(subcategoryImageView);
);
【问题讨论】:
删除第二个问题并将其添加为单独的问题。 @Alan 好的,但是你能解决第一个问题吗 这似乎是ViewHolder
实现或缓存的问题。你能发布你的VewHolder
s 的实现吗?
@Eddnav 请看上面的第一个代码,我在该代码的 startListening 方法中使用了 onCreateViewHolder 和 onBindViewHolder。
@Alan 你能看看这个吗***.com/questions/50592252/…
【参考方案1】:
尝试使用onResume
方法在旋转后再次将图像设置为图像视图。或者只使用 onSavedInstanceState
并将图像重新分配到 imageview 中,如以下问题所述:ImageView not retaining Image when Screen rotation occurs
【讨论】:
你能解释一下吗,因为我正在使用一个内部模型类,我将图像分配给 imageView 稍后显示在回收器视图中,为什么只有一个片段会出现问题而不是另一个。导航到其他 Fragment 并返回 home 后,只有一个 Fragment 显示主 Fragment 中的图像,而不是另一个。 你能不能也看看这个***.com/questions/50592252/…【参考方案2】:正如我在评论中提到的,这似乎与ViewHolder
实现或毕加索的缓存有关。您的代码中最可疑的部分是:
Picasso.with(ctx).load(thumb_image).networkPolicy(NetworkPolicy.OFFLINE);
您可能想删除那里的网络策略声明,您是否有理由首先使用错误回调来加载您的图像? Picasso 将自动为您执行此操作(如果无法从网络获取,则从内存/磁盘缓存中获取)。尝试删除它并仅使用以下方式加载图像:
Picasso.with(ctx).load(thumb_image).placeholder(R.drawable.default_avatar).into(subcategoryImageView);
编辑:另外,如果您需要更多信息,这里是 NetworkPolicy
的文档:https://square.github.io/picasso/2.x/picasso/com/squareup/picasso/NetworkPolicy.html。
【讨论】:
我尝试只使用 Picasso.with(ctx).load(thumb_image).placeholder(R.drawable.default_avatar).into(subcategoryImageView);但它仍然无法正常工作。我使用 NetworkPolicy.Offline 的原因是因为我想先离线加载图像,如果图像不可用,则从网络加载。即使使用我在同一代码中使用的第一个回收器视图,该代码也可以正常工作。问题出在第二个导航之后,它没有显示任何内容,整个回收站视图都消失了 是的,这就是我要告诉你的,你不需要回调来做到这一点,毕加索会自动处理。至于为什么它在导航上崩溃,我建议你在调试中隔离问题,在回收器视图中添加一些背景,看看它是否真的在导航上,也许Fragment
替换有问题。
我尝试为回收站视图提供彩色背景,但导航后它不存在。你能告诉我为什么会这样吗
你能帮我解决这个问题吗***.com/questions/50433123/…【参考方案3】:
经过大量搜索后,我发现我正在使用 setHasFixedSize(true) 和回收器视图的 wrap_content。我删除了 setHasFixedSize(true),现在它工作得很好。
【讨论】:
以上是关于导航后未附加回收站视图的主要内容,如果未能解决你的问题,请参考以下文章
带有 RecyclerView 的片段:java.lang.IllegalArgumentException:报废或附加的视图可能不会被回收。 isScrap:false isAttached:tru
如何通过 Instagram 故事等控件实现图像之间的导航?