1

我创建了一个用来填充RSS数据的ListFragment 。唯一的问题是我收到一个NullPointerException强制关闭我的应用程序。这是LogCat:

03-30 15:43:44.584: E/AndroidRuntime(28703): at com.example.app.TestFragment$MyCustomAdapter.getView(TestFragment.java:157)

该错误指向此代码:

listTitle.setText(feed.getList().get(position).getTitle());

从这个类;列表片段。

public final class TestFragment extends ListFragment {
private static final String KEY_CONTENT = "TestFragment:Content";

public static TestFragment newInstance(String content) {
    TestFragment fragment = new TestFragment();

    return fragment;
}

private RSSFeed myRssFeed = null;

private String mContent = "???";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if ((savedInstanceState != null)
            && savedInstanceState.containsKey(KEY_CONTENT)) {
        mContent = savedInstanceState.getString(KEY_CONTENT);
    }
}

private RSSFeed feed = null;

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

}

public void fillData() {

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
            .permitAll().build();

    StrictMode.setThreadPolicy(policy);

    try {
        URL rssUrl = new URL("http://allthingsd.com/feed/");
        SAXParserFactory mySAXParserFactory = SAXParserFactory
                .newInstance();
        SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
        XMLReader myXMLReader = mySAXParser.getXMLReader();
        RSSHandler myRSSHandler = new RSSHandler();
        myXMLReader.setContentHandler(myRSSHandler);
        InputSource myInputSource = new InputSource(rssUrl.openStream());
        myXMLReader.parse(myInputSource);

        myRssFeed = myRSSHandler.getFeed();

    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    if (myRssFeed != null) {
        /*
         * TextView feedTitle = (TextView) findViewById(R.id.feedtitle);
         * TextView feedDescribtion = (TextView)
         * findViewById(R.id.feeddescribtion); TextView feedPubdate =
         * (TextView) findViewById(R.id.feedpubdate); TextView feedLink =
         * (TextView) findViewById(R.id.feedlink);
         * feedTitle.setText(myRssFeed.getTitle());
         * feedDescribtion.setText(myRssFeed.getDescription());
         * feedPubdate.setText(myRssFeed.getPubdate());
         * feedLink.setText(myRssFeed.getLink());
         */
        MyCustomAdapter adapter = new MyCustomAdapter(getActivity(),
                R.layout.row, myRssFeed.getList());
        setListAdapter(adapter);

    }

}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString(KEY_CONTENT, mContent);
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    /*
     * Intent intent = new Intent(this,ShowDetails.class); Bundle bundle =
     * new Bundle(); bundle.putString("keyTitle",
     * myRssFeed.getItem(position).getTitle());
     * bundle.putString("keyDescription",
     * myRssFeed.getItem(position).getDescription());
     * bundle.putString("keyLink", myRssFeed.getItem(position).getLink());
     * bundle.putString("keyPubdate",
     * myRssFeed.getItem(position).getPubdate()); intent.putExtras(bundle);
     * startActivity(intent);
     */

}

public class MyCustomAdapter extends ArrayAdapter<RSSItem> {

    public MyCustomAdapter(Context context, int textViewResourceId,
            List<RSSItem> list) {
        super(context, textViewResourceId, list);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        View row = convertView;

        if (row == null) {
            LayoutInflater inflater = getActivity().getLayoutInflater();
            row = inflater.inflate(R.layout.row, parent, false);
        }

        TextView listTitle = (TextView) row.findViewById(R.id.textView2);
        listTitle.setText(feed.getList().get(position).getTitle());
        TextView listPubdate = (TextView) row.findViewById(R.id.textView1);
        listPubdate.setText(myRssFeed.getList().get(position).getPubdate());

        if (position % 2 == 0) {
            listTitle.setBackgroundColor(0xff101010);
            listPubdate.setBackgroundColor(0xff101010);
        } else {
            listTitle.setBackgroundColor(0xff080808);
            listPubdate.setBackgroundColor(0xff080808);
        }

        return super.getView(position, convertView, parent);

    }
}

   }
4

2 回答 2

2

该错误指向此代码:

listTitle.setText(feed.getList().get(position).getTitle());

查找 NullPointerException 相对容易,只需检查您引用的每个变量。例如,我看不到你在哪里实例化feed,你在这里声明它:

private RSSFeed feed = null;

但它永远不会收到除 之外的值null,在某个地方你需要这样的代码feed = new RSSFeed();......(你的意思是使用myRSSFeed吗?)

于 2013-03-30T15:59:56.090 回答
0

检查您的 row.xml id。这可能导致您的空指针。

于 2013-04-01T22:41:40.353 回答