Question

I think I messed up with my Context. Could somebody correct my codes? I cant seems to figure out how to implement Context into my lazyadapter. please take a look at my LOGCAT. Thanks.

AndroidFragment.java

public class AndroidFragment extends SherlockListFragment  implements ActionBar.TabListener{

    static final String URL = "https://myxml.xml";
    static final String KEY_SONG = "song";
    static final String KEY_ID = "id";
    static final String KEY_TITLE = "title";
    static final String KEY_CAT_ARTIST = "artistcat";
    static final String KEY_DURATION = "duration";
    static final String KEY_THUMB_URL = "thumb_url";
    static final String KEY_CAT_URL = "cat_url";
    ArrayList<HashMap<String, String>> menuItems;
    ListAdapter adapter;
    Context appContext;
    ListView list;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        appContext = inflater.getContext().getApplicationContext();

        new loadListView().execute();   

    return super.onCreateView(inflater, container, savedInstanceState);
    }


    public class loadListView extends AsyncTask<Integer, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(Integer... args) {
            // updating UI from Background Thread
            menuItems = new ArrayList<HashMap<String, String>>();


            XMLParser parser = new XMLParser();
            String xml = parser.getXmlFromUrl(URL); // getting XML
            Document doc = parser.getDomElement(xml); // getting DOM element

            NodeList nl = doc.getElementsByTagName(KEY_SONG);
            // looping through all item nodes <item>
            for (int i = 0; i < nl.getLength(); i++) {
                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();
                Element e = (Element) nl.item(i);
                // adding each child node to HashMap key => value
                map.put(KEY_ID, parser.getValue(e, KEY_ID));
                map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
                map.put(KEY_CAT_ARTIST, parser.getValue(e, KEY_CAT_ARTIST));
                map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION));
                map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));
                map.put(KEY_CAT_URL, parser.getValue(e, KEY_CAT_URL));

                // adding HashList to ArrayList
                menuItems.add(map);
            }
                return null;
            }   


        @Override
        protected void onPostExecute(String args) {


            adapter=new MainPageLazyAdapter(appContext, menuItems);   
             list.setAdapter(adapter);
         }
    }


    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.add(android.R.id.content, this);

        ft.attach(this);
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.detach(this);
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }

}

MainPageLazyAdapter.java

public class MainPageLazyAdapter extends BaseAdapter {

private Application activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public MainPageImageLoader imageLoader; 

public MainPageLazyAdapter(Context appContext, ArrayList<HashMap<String, String>> d) {
    activity = appContext;
    data=d;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader=new MainPageImageLoader(activity);
}

I got this error :

Type mismatch: cannot convert from Context to Application
Was it helpful?

Solution

Remove the (Activity) cast you use in the constructor. You already used inflator.getContext.getApplicationContext when you created an instance and you cannot cast it to an Activity context again. Either you pass the inflator.getContext() only (if you use the Activity context, you may get a memory leak), or you use the Application context, so you remove the Activity cast.

Edit:

You already have the ApplicationContext passed to the constructor, so there is no need to cast it again to Activity:

activity = (Activity) appContext;

Then get the Application context again:

imageLoader=new MainPageImageLoader(activity.getApplicationContext());

Just set activity = appContext; (the variable should be named Application now) and pass it directly imageLoader=new MainPageImageLoader(activity);

OTHER TIPS

look to MainPageLazyAdapter constructor code: activity = (Activity) appContext;
from other hand - class AndroidFragment.onCreateView: appContext = inflater.getContext().getApplicationContext();


and in AndroidFragment.onPostExecute :
adapter=new MainPageLazyAdapter(appContext, menuItems);
so - you are casting Application Context to Activity and it сouses cast error.

to avoid this situation you might override AndroidFragment.onAttach method and add one member to AndroidFragment:

protected Activity fragmentActivity;    
@Override public void onAttach (Activity activity){
    fragmentActivity = activity;
}


then replace
adapter=new MainPageLazyAdapter(appContext, menuItems);
with
adapter=new MainPageLazyAdapter(fragmentActivity, menuItems);


and ... consider move imageLoader=new MainPageImageLoader(activity.getApplicationContext());
to onAttach()

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top