commit fragment from onLoadFinished within activity

后端 未结 3 1398
一向
一向 2020-12-31 10:57

I have an activity which loads a data list from the server using loader callbacks. I have to list out the data into a fragment which extends

SherlockListFra         


        
3条回答
  •  臣服心动
    2020-12-31 11:45

    As @kwazi answered this is a bad user experience to call FragmentTransition.commit() from onLoadFinished(). I have found a solution for this event by using ProgressDialog.

    First created ProgressDialog.setOnDismissListener(new listener) for watching the onLoadFinished(). Further i do progressDialog.show() before getLoaderManager().restartLoader(). And eventually place progressDialog.dismiss() in onLoadFinished(). Such approach allow do not bind main UI thread and Loader's thread.

    public class FrPersonsListAnswer extends Fragment 
    						   implements 
    						   LoaderCallbacks{
    private ProgressDialog progressDialog;
                                 	@Override
    	public View onCreateView(LayoutInflater inflater,
    			 ViewGroup container, Bundle savedInstanceState) {
    		View view = inflater.inflate(R.layout.fragment_persons_list, container, false);
    		
    		//prepare progress Dialog
    		progressDialog = new ProgressDialog(curActivity);
    		progressDialog.setMessage("Wait...");
    		progressDialog.setIndeterminate(true);
    		progressDialog.setOnDismissListener(new OnDismissListener() {
    			
    			@Override
    			public void onDismiss(DialogInterface dialog) {
    				//make FragmentTransaction.commit() here;
    				
    				//but it's recommended to pass control to your Activity 
    				//via an Interface and manage fragments there.
    			}
    		});
    		
    		lv = (ListView) view.findViewById(R.id.lv_out1);
    		lv.setOnItemClickListener(new OnItemClickListener() {
    
    			@Override
    			public void onItemClick(AdapterView parent, final View view,
    					final int position, long id) {
    				
    				//START PROGRESS DIALOG HERE
    				progressDialog.show();
    				
    				Cursor c = (Cursor) parent.getAdapter().getItem(position);
    
    				// create Loader 
    				getLoaderManager().restartLoader(1,	null, curFragment);
    			}
    		});
    
    		return view;
    	}
        
    	@Override
    	public void onLoadFinished(Loader loader, Cursor data) {
    		switch (loader.getId()) {
    		case 1:
    			//dismiss dialog and call progressDialog.onDismiss() listener
    			progressDialog.dismiss();
    			break;
    
    		default:
    			break;
    		}
    	}

提交回复
热议问题