在onResume()中更新recyclerView;

时间:2018-02-12 16:57:47

标签: android performance android-recyclerview recycler-adapter

我在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之间交替时,这会导致重新创建适配器的延迟

在这种情况下我该怎么做?

我为这个可怕的英语道歉,我正在使用谷歌翻译。

2 个答案:

答案 0 :(得分:2)

这是Scope Problem。您需要在某个类成员中定义adapter

  1. 如果您希望片段A和片段D中显示的数据不同,请将adapter作为彼此的成员,并在每个Fragment.onCreate()中初始化它。因此它不会重新创建适配器外翻时间。 (确保ViewPager有足够的缓存编号,否则它仍会重新创建整个非缓存的片段)

  2. 如果您希望FragmentA和FragmentD显示相同的数据或相同数据的一部分,请在adapter中创建MainActivity.onCreate并将其作为参数传递到FragmentA,FragmentD。

    < / LI>

    每次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)