I am trying to make an application with MenuDrawer that contains 4 fragments. This is how my application show do. When it starts, it should retrieve data from a website. The retrieved data should be in a listview in the first fragment. The second fragment should contain a webview to view my page in the android device. The third is to show the some text details. My Application crashes when the first fragment gets the details from the website. Here is my code : My fragment layout as the following:
My First Fragment contains the following:
<ListView
android:layout_marginTop="10dp"
android:layout_below="@+id/txtLabel"
android:layout_width="match_parent"
android:layout_height="300dp"
android:background = "@android:color/transparent"
android:padding="3dp"
android:dividerHeight="1dp"
android:id="@+id/mlv"></ListView>
The first fragment is called when the app starts. I have a list adapter and a list model which worked well.
My Main class contains an inner class which gets the data. I already made my model class and the adapter class: Here is my main code :
public class MainActivity extends Activity {
// declare properties
private String[] mNavigationDrawerItemTitles;
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ListView mListView;
private ListViewNewsAdapter listViewNewsAdapter;
private ArrayList<ListViewNewsItem> listViewNewsItems;
private JSONParser jsonParser = new JSONParser();
private String READNEWS_URL =
"xyz-myweb-xyz.com";
private ActionBarDrawerToggle mDrawerToggle;
// nav drawer title
private CharSequence mDrawerTitle;
// used to store app title
private CharSequence mTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.mlv);
// for proper titles
mTitle = mDrawerTitle = getTitle();
// initialize properties
mNavigationDrawerItemTitles = getResources().getStringArray(R.array.navigation_drawer_items_array);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
// list the drawer items
ObjectDrawerItem[] drawerItem = new ObjectDrawerItem[4];
drawerItem[0] = new ObjectDrawerItem(R.drawable.home_icon, "Home");
drawerItem[1] = new ObjectDrawerItem(R.drawable.website_icon, "Website");
drawerItem[2] = new ObjectDrawerItem(R.drawable.ic_action_share, "Help");
// Pass the folderData to our ListView adapter
DrawerItemCustomAdapter adapter = new DrawerItemCustomAdapter(this, R.layout.listview_item_row, drawerItem);
// Set the adapter for the list view
mDrawerList.setAdapter(adapter);
// set the item click listener
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
// for app icon control for nav drawer
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(
this, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description */
R.string.drawer_close /* "close drawer" description */
) {
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
getActionBar().setTitle(mTitle);
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
getActionBar().setTitle(mDrawerTitle);
}
};
// Set the drawer toggle as the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);
// enable ActionBar app icon to behave as action to toggle nav drawer
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
if (savedInstanceState == null) {
// on first time display view for first nav item
selectItem(0);
}
}
The method which deals with the fragments, it's inside the myMainActivity :
private void selectItem(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
switch (position) {
case 0:
fragment = new CreateFragment();
new GetNewsTask().execute();
break;
case 1:
fragment = new ReadFragment();
break;
case 2:
fragment = new HelpFragment();
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(mNavigationDrawerItemTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
} else {
// error in creating fragment
Log.e("MainAct10ity", "Error in creating fragment");
}
}
I used an inner class which retrieve the data from the web:
private class GetNewsTask extends AsyncTask<Void, Void, Boolean>
{
private ProgressDialog mProgressDialog;
private JSONObject jsonObjectResult = null;
private String error;
@Override
protected void onPreExecute()
{
super.onPreExecute();
listViewNewsItems = new ArrayList<ListViewNewsItem>();
mProgressDialog = ProgressDialog.show(MainActivity.this,
"Processing...", "Get last news", false, false);
}
@Override
protected Boolean doInBackground(Void... params)
{
jsonObjectResult = jsonParser.makeHttpRequest(READNEWS_URL, null);
if (jsonObjectResult == null)
{
error = "Error in the connection";
return false;
}
try
{
if (jsonObjectResult.getInt("success") == 1)
{
JSONArray jsonArray = jsonObjectResult.getJSONArray("posts");
for (int i = 0; i < jsonArray.length(); i++)
{
JSONObject news = jsonArray.getJSONObject(i);
ListViewNewsItem listViewNewsItem = new ListViewNewsItem
(
news.getString("title"),
news.getString("type")
);
listViewNewsItems.add(listViewNewsItem);
}
return true;
}
else
error = jsonObjectResult.getString("message");
}
catch (Exception ex)
{
}
return false;
}
@Override
protected void onPostExecute(Boolean aBoolean)
{
super.onPostExecute(aBoolean);
mProgressDialog.dismiss();
if (aBoolean)
{
listViewNewsAdapter = new ListViewNewsAdapter(getApplicationContext(),
listViewNewsItems);
mListView.setAdapter(listViewNewsAdapter);
}
else
Toast.makeText(getApplicationContext(), error, Toast.LENGTH_LONG).show();
}
}
Where do I have to use
new GetNewsTask().execute();
I tried to use it in onCreate, my app crashed. I tried to use it inside the switch my app crashes. do you have any idea how to fix it ?