Domanda

i want to make RSS reader but i have this problem "No enclosing instance of the type Main2 is accessible in scope" in onpostexecute for arrayadapter can't be defined for "this" class i search for that problem but couldn't find the solution >>> pleaaaase any one can help :(

public class Main2 extends ListActivity {
Button grow, price, disease;
Intent go, pr, dis;
List headlines;
List links;

public Main2() {
    // TODO Auto-generated constructor stub
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    // Binding data
    // ArrayAdapter adapter = new ArrayAdapter(this,
    // android.R.layout.simple_list_item_1, headlines);
    //
    // setListAdapter(adapter);
    new GetRSS().execute();

    grow = (Button) findViewById(R.id.bt_plants);
    price = (Button) findViewById(R.id.bt_prices);
    disease = (Button) findViewById(R.id.bt_diseases);
    grow.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            go = new Intent(getApplicationContext(), Plantgrow.class);
            startActivity(go);
        }
    });
    price.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            pr = new Intent(getApplicationContext(), Price.class);
            startActivity(pr);

        }
    });
    disease.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            dis = new Intent(getApplicationContext(), Diseases.class);
            startActivity(dis);
        }
    });

}

protected void onListItemClick(ListView l, View v, int position, long id) {
    Uri uri = Uri.parse((String) links.get(position));
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(intent);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main2, menu);
    return true;
}

}

class GetRSS extends AsyncTask<String, String, List> {
List Aheadlines, Alinks;

protected List doInBackground(String... args) {
    // List headlines, links;
    Aheadlines = new ArrayList();
    Alinks = new ArrayList();

    try {
        URL url = new URL("http://feeds.pcworld.com/pcworld/latestnews");

        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(false);
        XmlPullParser xpp = factory.newPullParser();

        // We will get the XML from an input stream
        xpp.setInput(getInputStream(url), "UTF_8");

        /*
         * We will parse the XML content looking for the "<title>" tag which
         * appears inside the "<item>" tag. However, we should take in
         * consideration that the rss feed name also is enclosed in a
         * "<title>" tag. As we know, every feed begins with these lines:
         * "<channel><title>Feed_Name</title>...." so we should skip the
         * "<title>" tag which is a child of "<channel>" tag, and take in
         * consideration only "<title>" tag which is a child of "<item>"
         * 
         * In order to achieve this, we will make use of a boolean variable.
         */
        boolean insideItem = false;

        // Returns the type of current event: START_TAG, END_TAG, etc..
        int eventType = xpp.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            if (eventType == XmlPullParser.START_TAG) {

                if (xpp.getName().equalsIgnoreCase("item")) {
                    insideItem = true;
                } else if (xpp.getName().equalsIgnoreCase("title")) {
                    if (insideItem)
                        Aheadlines.add(xpp.nextText()); // extract the
                                                        // headline
                } else if (xpp.getName().equalsIgnoreCase("link")) {
                    if (insideItem)
                        Alinks.add(xpp.nextText()); // extract the link of
                                                    // article
                }
            } else if (eventType == XmlPullParser.END_TAG
                    && xpp.getName().equalsIgnoreCase("item")) {
                insideItem = false;
            }

            eventType = xpp.next(); // move to next element
        }

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return Aheadlines;
}

protected void onPostExecute(List feed) {
    // TODO: check this.exception
    // TODO: do something with the feed
    super.onPostExecute(feed);

    // ListView itcItems = (ListView) findViewById(android.R.id.list);

    // Create a list adapter

    ArrayAdapter adapter = new ArrayAdapter(Main2.this,
            android.R.layout.simple_list_item_1, Aheadlines);
    // Set list adapter for the ListView
    Main2.setListAdapter(adapter);

}

//
public InputStream getInputStream(URL url) {
    try {
        return url.openConnection().getInputStream();
    } catch (IOException e) {
        return null;
    }
}
È stato utile?

Soluzione

It's because your AsyncTask GetRSS isn't an inner class of Main2.

You have to make in an inner class (so basically you just have to remove one { before declaring your GetRSS class. And add one } at the end of your file of course.

In that way your GetRSS class will be an inner class and you Main2 will be in it's scope.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top