Android : Where and how to do network call when using fragments

on Monday, March 30, 2015


I am building an app that has fragments. Im not entirely sure when to make a http nw call to get data to populate components within these fragments. I have a call that gets all the data i need for all my fragments to draw the screen. I have tested that a async task gets that data ok but in the postExecute i don't have access to components unless im in the fragment class, even then how would i put it in there.


I can do a asyncTask and see my data coming back but where do i put this, i want to make the call once. ActivityTileData.getLoginTileDataArray(getActivity()); currently returns dummy data, ideally this would do the network call.



public class StaggeredGridActivityFragment extends FragmentActivity {

private static final String TAG = "StaggeredGridActivityFragment";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

this.requestWindowFeature(Window.FEATURE_NO_TITLE); //remove title bar

final FragmentManager fm = getSupportFragmentManager();

// Create the list fragment and add it as our sole content.
if (fm.findFragmentById(android.R.id.content) == null) {
final StaggeredGridFragment fragment = new StaggeredGridFragment();
fm.beginTransaction().add(android.R.id.content, fragment).commit();
}
}


private class StaggeredGridFragment extends Fragment implements
AbsListView.OnScrollListener, AbsListView.OnItemClickListener {
private StaggeredGridView mGridView;
private boolean mHasRequestedMore;
private TilesAdapter mAdapter;

private ArrayList<String> mData;

@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}

@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
return inflater.inflate(R.layout.activity_sgv, container, false);
}

@Override
public void onActivityCreated(final Bundle savedInstanceState) {


//Encapsulate all within a post cereate from a async task or call a blocking http call
super.onActivityCreated(savedInstanceState);

mGridView = (StaggeredGridView) getView().findViewById(R.id.grid_view);

if (savedInstanceState == null) {
final LayoutInflater layoutInflater = getActivity().getLayoutInflater();
View header = layoutInflater.inflate(R.layout.list_item_header_footer, null);
mGridView.addHeaderView(header);
}

if (mAdapter == null) {
mAdapter = new TilesAdapter(getActivity(), R.id.summary1_value);
}

if (mData == null) {
mData = ActivityTileData.getLoginTileDataArray(getActivity());
}


for (String data : mData) {
mAdapter.add(data); //Add each mData TileAdapter element to an mAdapter where it will be further broken down and used by the TileAdapter
}

mGridView.setAdapter(mAdapter);
mGridView.setOnScrollListener(this);
mGridView.setOnItemClickListener(this);
}

0 comments:

Post a Comment