【问题标题】:onResume does not work on fragment changeonResume 不适用于片段更改
【发布时间】:2019-11-25 08:23:31
【问题描述】:

有两个片段选项卡。我会简要解释一下,在第一个片段选项卡中,我将我的图像(网格视图)设置为收藏,并使用房间数据库在第二个片段选项卡中显示该最喜欢的图像......问题是在重新启动应用程序后添加了最喜欢的图像吗?谁能告诉我我该怎么办?我已经尝试过恢复,但是当我切换选项卡时它不起作用。每次如果我想将最近添加的图像作为收藏夹,我必须重新启动应用程序...谁能帮忙?

第一个片段:

public class FirstFragment extends Fragment {
private GridViewAdapter adapter;
private GridView mGridView;
//ProgressBar myProgressBar;
ProgressDialog progressDialog;
ViewPager viewPager;
private static final String HI = "http://mapi.trycatchtech.com/v1/stylish_hair_cut_for_pubg/stylish_hair_cut_for_pubg_list";
public List<RetroPhoto> product_lists=new ArrayList<>();

private JsonArrayRequest request;
private RequestQueue requestQueue;
public static FavoriteDatabase favoriteDatabase;


private void populateGridView(List<RetroPhoto> spacecraftList) {
    //mGridView = findViewById(R.id.mGridView);
    mGridView = getView().findViewById(R.id.mGridView);
    adapter = new GridViewAdapter(getContext(), spacecraftList);
    mGridView.setAdapter(adapter);
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_first, container, false);
    return rootView;
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    favoriteDatabase = Room.databaseBuilder(getContext(), FavoriteDatabase.class, "myfavdb").allowMainThreadQueries().build();

    //  myProgressBar= getView().findViewById(R.id.myProgressBar);
    progressDialog = new ProgressDialog(getContext());
    progressDialog.setMessage("Loading....");
    progressDialog.show();

    /*Create handle for the RetrofitInstance interface*/
    GetDataService myAPIService = RetrofitClientInstance.getRetrofitInstance().create(GetDataService.class);

    Call<List<RetroPhoto>> call = myAPIService.getAllPhotos();
    call.enqueue(new Callback<List<RetroPhoto>>() {

        @Override
        public void onResponse(Call<List<RetroPhoto>> call, Response<List<RetroPhoto>> response) {
            //        myProgressBar.setVisibility(View.GONE);
            progressDialog.dismiss();
            populateGridView(response.body());
            getData();
        }




        @Override
        public void onFailure(Call<List<RetroPhoto>> call, Throwable throwable) {
            //        myProgressBar.setVisibility(View.GONE);
            progressDialog.dismiss();
            Log.d("url", "error");
        }
    });}private void getData()
  {

request = new JsonArrayRequest(HI, new com.android.volley.Response.Listener<JSONArray>() {
    @Override
    public void onResponse(JSONArray response) {
        JSONObject ob;

        for (int i = 0; i <response.length(); i++) {
            try {

                ob = response.getJSONObject(i);
                RetroPhoto pr = new RetroPhoto(ob.getInt("id"),
                        ob.getString("image"),
                        ob.getString("thumb_image"));

                product_lists.add(pr);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        setupData(product_lists);
    }
}, new com.android.volley.Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Toast.makeText(getContext(), "errrrrrrrrrr", Toast.LENGTH_LONG).show();

    }
});
requestQueue = Volley.newRequestQueue(getContext());
  requestQueue.add(request);
}
private void setupData(List<RetroPhoto> product_lists) {
    adapter = new GridViewAdapter(getContext(), product_lists);
    mGridView.setAdapter(adapter);
}}

第二个片段:

public class SecondFragment extends Fragment  {
private RecyclerView rv;
private FavoriteAdapter adapter;
public static FavoriteDatabase favoriteDatabase;
ProgressDialog progressDialog;



@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.activity_favourites,container, false);
    return rootView;
}



@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);


    rv=(RecyclerView)getView().findViewById(R.id.rec);
    rv.setHasFixedSize(true);
    rv.setLayoutManager(new LinearLayoutManager(getContext()));



}
public void getFavData() {

    List<FavoriteList> favoriteLists=FirstFragment.favoriteDatabase.favoriteDao().getFavoriteData();
    adapter=new FavoriteAdapter(favoriteLists,getContext());
    rv.setAdapter(adapter);
}

@Override
public void onResume() {
    this.getFavData();
    super.onResume();
}}

【问题讨论】:

    标签: android json android-fragments android-room android-fragmentactivity


    【解决方案1】:

    您将这两个片段放在ActivityFragment 中的什么位置?你在使用ViewPager 作为标签吗?

    我怀疑第二个片段在您选择最喜欢的图像之前已实例化,这就是它永远不会更新的原因。如果是这种情况,在 onResume() 内调用 getFavData() 将无济于事。

    其中一种方法是在设置喜欢的图像后在您的主要片段/活动中调用SecondFragment.getFavData()

    尝试在第二个片段中添加这个:

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if(isVisibleToUser) {
            getFavData();
        }
    }
    

    【讨论】:

    • hi yang liu...是的,我正在使用视图寻呼机..我应该把 SecondFragment.getFavData() 放在第一个片段的哪里??无论我把这个 getfavdata 放在哪里都显示错误
    • 你知道我们可以在第二个片段中做什么吗???
    • 我将编辑我的帖子并添加一些代码供您尝试。
    • 谢谢 yang liu .... 等你的帖子...其实我指的是这个博客 "uniqueandrocode.com/…" 如果对你有帮助的话看看这个
    • 它适用于少数图像......不是全部......我应该怎么做????......而且我对第一个片段有疑问,即使我已经点击了一些喜欢的按钮还没有按下那个...任何帮助呢???
    【解决方案2】:

    正如您提到的,您使用viewpager 放置两个片段,您需要在onResume()setUserVisibleHint(boolean isVisibleToUser) 中调用getFavDataonResume()在创建fragment时第一次调用,setUserVisibleHint()在viewpager中页面显示或隐藏时调用。

    【讨论】:

    • setUserVisibleHint 已弃用
    • 嘿,我正在使用这种方法“uniqueandrocode.com/…
    • 嘿,你发现了吗?
    • @Wini 是的,刚刚查看了最新的文档,不推荐使用 setUserVisileHint()。您可以使用setMaxLifecycle 代替setUserVisibleHint(),请参考here。顺便说一句,我有点困惑,您指的博客与fragment无关。
    • 我提到该博客只是为了添加到收藏夹中,实际上我的图片是第一个片段,我想将这些图片设置为收藏夹并将其显示在第二个片段中,这就是为什么..似乎这些图片被选中了我还没有标记为最喜欢的……一切都太混乱了,试试 setmaxlifecycle 让你很快知道微博
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多