Refresh or force redraw the fragment

后端 未结 8 1624
失恋的感觉
失恋的感觉 2020-11-30 02:10

I have a fragment that inflates an xml layout. My requirement is to update the text size on all my views inside my fragment when my Activity is resumed. I tried



        
相关标签:
8条回答
  • 2020-11-30 02:39

    To solve the problem, I use this:

    Fragment frg = null;
    frg = getFragmentManager().findFragmentByTag("Feedback");
    final android.support.v4.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.detach(frg);
    ft.attach(frg);
    ft.commit();
    
    0 讨论(0)
  • 2020-11-30 02:42

    I do not think there is a method for that. The fragment rebuilds it's UI on onCreateView()... but that happens when the fragment is created or recreated.

    You'll have to implement your own updateUI method or where you will specify what elements and how they should update. It's rather a good practice, since you need to do that when the fragment is created anyway.

    However if this is not enough you could do something like replacing fragment with the same one forcing it to call onCreateView()

    FragmentTransaction tr = getFragmentManager().beginTransaction();
    tr.replace(R.id.your_fragment_container, yourFragmentInstance);
    tr.commit()
    

    NOTE

    To refresh ListView you need to call notifyDataSetChanged() on the ListView's adapter.

    0 讨论(0)
  • 2020-11-30 02:45

    let us see the below source code. Here fragment name is DirectoryOfEbooks. After completion of the background task, i am the replacing the frame with current fragment. so the fragment gets refreshed and reloads its data

        import android.app.ProgressDialog;
        import android.content.DialogInterface;
        import android.database.Cursor;
        import android.database.sqlite.SQLiteDatabase;
        import android.os.AsyncTask;
        import android.os.Bundle;
        import android.support.v4.app.Fragment;
        import android.support.v4.app.FragmentTransaction;
        import android.support.v4.view.MenuItemCompat;
        import android.support.v7.app.AlertDialog;
        import android.support.v7.widget.DefaultItemAnimator;
        import android.support.v7.widget.GridLayoutManager;
        import android.support.v7.widget.LinearLayoutManager;
        import android.support.v7.widget.RecyclerView;
        import android.support.v7.widget.SearchView;
        import android.view.LayoutInflater;
        import android.view.Menu;
        import android.view.MenuInflater;
        import android.view.MenuItem;
        import android.view.View;
        import android.view.ViewGroup;
        import android.widget.TextView;
        import android.widget.Toast;
    
        import com.github.mikephil.charting.data.LineRadarDataSet;
    
        import java.util.ArrayList;
        import java.util.List;
    
    
        /**
         * A simple {@link Fragment} subclass.
         */
        public class DirectoryOfEbooks extends Fragment {
    
            RecyclerView recyclerView;
            branchesAdapter adapter;
            LinearLayoutManager linearLayoutManager;
            Cursor c;
            FragmentTransaction fragmentTransaction;
            SQLiteDatabase db;
            List<branch_sync> directoryarraylist;
    
            public DirectoryOfEbooks() {
                // Required empty public constructor
            }
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
    
    
                View view = inflater.inflate(R.layout.fragment_directory_of_ebooks, container, false);
                directoryarraylist = new ArrayList<>();
                db = getActivity().openOrCreateDatabase("notify", android.content.Context.MODE_PRIVATE, null);
                c = db.rawQuery("select * FROM branch; ", null);
    
                if (c.getCount() != 0) {
                    c.moveToFirst();
                    while (true) {
                        //String ISBN = c.getString(c.getColumnIndex("ISBN"));
                        String branch = c.getString(c.getColumnIndex("branch"));
    
                        branch_sync branchSync = new branch_sync(branch);
                        directoryarraylist.add(branchSync);
                        if (c.isLast())
                            break;
                        else
                            c.moveToNext();
                    }
    
                    recyclerView = (RecyclerView) view.findViewById(R.id.directoryOfEbooks);
                    adapter = new branchesAdapter(directoryarraylist, this.getContext());
                    adapter.setHasStableIds(true);
                    recyclerView.setItemAnimator(new DefaultItemAnimator());
                    System.out.println("ebooks");
                    recyclerView.setHasFixedSize(true);
                    linearLayoutManager = new LinearLayoutManager(this.getContext());
                    recyclerView.setLayoutManager(linearLayoutManager);
                    recyclerView.setAdapter(adapter);
                    System.out.println(adapter.getItemCount()+"adpater count");
    
                }
                // Inflate the layout for this fragment
                return view;
            }
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                //setContentView(R.layout.fragment_books);
                setHasOptionsMenu(true);
            }
            public void onPrepareOptionsMenu(Menu menu) {
                MenuInflater inflater = getActivity().getMenuInflater();
                inflater.inflate(R.menu.refresh, menu);
                MenuItem menuItem = menu.findItem(R.id.refresh1);
                menuItem.setVisible(true);
            }
            public boolean onOptionsItemSelected(MenuItem item) {
                if (item.getItemId() == R.id.refresh1) {
                    new AlertDialog.Builder(getContext()).setMessage("Refresh takes more than a Minute").setPositiveButton("Refresh Now", new DialogInterface.OnClickListener() {
    
                        public void onClick(DialogInterface dialog, int which) {
    
                            new refreshebooks().execute();
                        }
                    }).setNegativeButton("Refresh Later", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
    
                        }
                    }).setCancelable(false).show();
    
                }
                return super.onOptionsItemSelected(item);
            }
    
        public class refreshebooks extends AsyncTask<String,String,String>{
            ProgressDialog progressDialog;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
              progressDialog=new ProgressDialog(getContext());
                progressDialog.setMessage("\tRefreshing Ebooks .....");
                progressDialog.setCancelable(false);
                progressDialog.show();
            }
    
            @Override
            protected String doInBackground(String... params) {
                Ebooksync syncEbooks=new Ebooksync();
                String status=syncEbooks.syncdata(getContext());
                return status;
    
            }
    
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                if(s.equals("error")){
                    progressDialog.dismiss();
                    Toast.makeText(getContext(),"Refresh Failed",Toast.LENGTH_SHORT).show();
                }
                else{
                    fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.mainframe, new DirectoryOfEbooks());
                    fragmentTransaction.commit();
                    progressDialog.dismiss();
                    adapter.notifyDataSetChanged();
                    Toast.makeText(getContext(),"Refresh Successfull",Toast.LENGTH_SHORT).show();
                }
    
            }
        }
    
        }
    
    0 讨论(0)
  • 2020-11-30 02:47

    Use the following code for refreshing fragment again:

    FragmentTransaction ftr = getFragmentManager().beginTransaction();                          
    ftr.detach(EnterYourFragmentName.this).attach(EnterYourFragmentName.this).commit();
    
    0 讨论(0)
  • 2020-11-30 02:49

    detach().detach() not working after support library update 25.1.0 (may be earlier). This solution works fine after update:

    getSupportFragmentManager()
        .beginTransaction()
        .detach(oldFragment)
        .commitNowAllowingStateLoss();
    
    getSupportFragmentManager()
        .beginTransaction()
        .attach(oldFragment)
        .commitAllowingStateLoss();
    
    0 讨论(0)
  • 2020-11-30 02:52

    In my case,detach and attach work for me.

     getSupportFragmentManager()
                    .beginTransaction()
                    .detach(contentFragment)
                    .attach(contentFragment)
                    .commit();
    
    0 讨论(0)
提交回复
热议问题