我在onResume方法中从recyclerView“重新创建”适配器时遇到了一些问题。 基本上,这是我的计划。
MainActivit -ViewPager
- fragment A (has a recyclerView)
- fragment B (nop)
- fragment C (nop)
- fragment D (it has the same recyclerView as the framgnet A)
onResume我总是要求
> myCustomAdapter adapter = new myCustomAdapter (
> mListItems,getContext(),ParseUser.getCurrentUser().getObjectId(),
> "type");
> recyclerView.setAdapter(adapter);
但是这会导致一些问题,比如当我从另一个活动回到MainActivity时。例如。
Activityt A
- click on item in recylerView
- start Activity B
Activity B
user does some actions, sees some news, and returns to Activity A.
Activity A
recreates the adapter and set recyclerView.setAdapter (new Adapter);
this is slow, causes a delay of 2 seconds after onBackPressed is pressed in Activity B.
我还有一个 setMenuVisibility 方法也与onResume做同样的事情,因为在片段D中通知我在片段A中有recyclerView,所以如果用户在recyclerView中做了一些更改在片段D中,我需要在用户返回时更新片段A的recyclerView。
为什么片段D中的相同回收者视图位于片段A中?
我们可以考虑以下内容,在片段A中,我有一个仅包含“用户兴趣”的recyclelerView,在片段D中,我有用户信息,如用户名,照片等......还有“用户兴趣“。
结论:问题是当我从Activity B返回到Activity A时,当我在viewPager中的片段A和片段D之间交替时,这会导致重新创建适配器的延迟
在这种情况下我该怎么做?
我为这个可怕的英语道歉,我正在使用谷歌翻译。
答案 0 :(得分:2)
这是Scope Problem
。您需要在某个类成员中定义adapter
。
如果您希望片段A和片段D中显示的数据不同,请将adapter
作为彼此的成员,并在每个Fragment.onCreate()
中初始化它。因此它不会重新创建适配器外翻时间。 (确保ViewPager有足够的缓存编号,否则它仍会重新创建整个非缓存的片段)
如果您希望FragmentA和FragmentD显示相同的数据或相同数据的一部分,请在adapter
中创建MainActivity.onCreate
并将其作为参数传递到FragmentA,FragmentD。
每次adapter
都不需要重新创建onResume
,因为它真的很重要。无需更改任何视图图层属性。确保要共享的数据(适配器)在同一范围内或可以传递给它。
例如:
//MainActivity
private Adapter adapter;
void onCreate(Bundle savedInstanceState){
//...other stuff
adapter = new myCustomAdapter (mListItems,getContext(),ParseUser.getCurrentUser().getObjectId(), "type");
}
public Adapter getAdapter(){ return adapter;}
//FragmentA or FragmentD
void onCreateView(){
MainActivity activity = (MainActivity) getActivity(); //This fragment should be created with `MainActivity`
recyclerView.setAdapter(activity.getAdapter());
}
答案 1 :(得分:0)
处理大图像或多个小图像时,不要使用ImageView的“src”属性设置设置图像 使用像Glide或Picasso这样的图像加载库。 以下代码段适用于Glide v4
Glide.with(context).load(<url_or_res_id>).into(imageView)
您可以将url作为字符串传递。或者,如果要从drawable加载图像,则可以传递其资源ID(例如R.drawable.image_id)