Listfragment onclick错误

时间:2013-11-21 21:43:03

标签: android onclick rss android-listfragment

我正在为Android编写一个带有预定义URL的RSS阅读器。我创建了一个ListFragment来显示RSS提要的元素,它使用异步任务来获取内容 我现在最大的问题是,onListItemClick不起作用。

public class List_Fragment extends ListFragment {
private final String TAG = RSSMain.class.getSimpleName();
// URL to read from
private final String[] URL_POOL = new String[] { "http://www.jugendnetz-berlin.de/de/arbeitswelt/rss.php",
        "http://www.jugendnetz-berlin.de/de/aktuelles/neues/rss/rss.php", "http://www.jugendnetz-berlin.de/de/arbeitswelt/rss.php"};
private String URL_RSS;
public int index = 0;
private Callbacks mCallbacks = sDummyCallbacks;
private static Content content;

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

    content = new Content();
    URL_RSS = URL_POOL[index];
    System.out.println(URL_RSS);
    // Start parsing feed
    new ReadRssFeedTask(getActivity()).execute();

}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

}

public interface Callbacks {
    /**
     * Callback for when an item has been selected.
     */
    public void onItemSelected(String url);
}

private static Callbacks sDummyCallbacks = new Callbacks() {
    @Override
    public void onItemSelected(String url) {
    }
};


public class ReadRssFeedTask extends AsyncTask<Void, Void, Void> {

    private ProgressDialog dialog;
    private HttpClient client;
    private HttpGet httpGet;
    private HttpResponse response;

    public ReadRssFeedTask(Activity activity) {
        client = new DefaultHttpClient();
        httpGet = new HttpGet(URL_RSS);
        response = null;
        dialog = new ProgressDialog(activity);
    }

    protected void onPreExecute() {
        dialog.setTitle("Bitte warten");
        dialog.setMessage("Der RSS Feed wird vom Server geladen.");
        dialog.show();
    }

    @Override
    protected Void doInBackground(Void... tmp) {
        try {
            response = client.execute(httpGet);
        } catch (ClientProtocolException e) {
            Log.e(TAG, "Falsches Protokoll" + e.getMessage());
        } catch (IOException e) {
            Log.e(TAG, "URL ist falsch, URL:" + URL_RSS + e.getMessage());
        }

        if (response != null) {
            StatusLine statusLine = response.getStatusLine();

            if (statusLine.getStatusCode() == 200) {
                HttpEntity entity = response.getEntity();

                try {
                    SAXParserFactory spf = SAXParserFactory.newInstance();
                    SAXParser sp = null;
                    try {
                        sp = spf.newSAXParser();
                    } catch (ParserConfigurationException e) {
                        Log.e(TAG, "Fehler:" + e.getMessage());
                    } catch (SAXException e) {
                        Log.e(TAG, "Fehler im Handler" + e.getMessage());
                    }

                    XmlHandler myHandler = new XmlHandler(content);

                    try {

                        sp.parse(entity.getContent(), myHandler);
                    } catch (SAXException e) {
                        Log.e(TAG,
                                "Fehler beim Parsen. Fehler:"
                                        + e.getMessage());
                    } catch (IOException e) {
                        Log.e(TAG,
                                "URL " + URL_RSS
                                        + " konnte nicht geöffnet werden!"
                                        + e.getMessage());
                    }

                } catch (IllegalStateException e) {
                    e.printStackTrace();
                }

            } else {
                Log.i(RSSMain.class.getSimpleName(),
                        "Der Server antwortet mit anderem Statuscode als 200.");
            }
        } else {
            Log.i(RSSMain.class.getSimpleName(),
                    "Keine Internetverbindung.");
        }

        return null;
    }

    protected void onExecute(Void result) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }


    }

    protected void onPostExecute(Void result) {
        // End dialog feed when completely parsed
        if (dialog.isShowing()) {
            dialog.dismiss();
        }

        // fill list with data
        setListAdapter(new CustomAdapter(getActivity(),
                android.R.layout.simple_list_item_1, XmlHandler.myContent));

    }
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    // Activities containing this fragment must implement its callbacks.
    if (!(activity instanceof Callbacks)) {
        throw new IllegalStateException(
                "Activity must implement fragment's callbacks.");
    }

    mCallbacks = (Callbacks) activity;
}

@Override
public void onDetach() {
    super.onDetach();

    // Reset the active callbacks interface to the dummy implementation.
    mCallbacks = sDummyCallbacks;
}

@Override
public void onListItemClick(ListView listView, View view, int position,
        long id) {
    super.onListItemClick(listView, view, position, id);

    // Notify the active callbacks interface (the activity, if the
    // fragment is attached to one) that an item has been selected.
    mCallbacks.onItemSelected(XmlHandler.myContent.get(position)
            .getUrl(position));
}
}  

其活动的样式xml是     

<FrameLayout android:id="@+id/fragment_placeholder" android:layout_weight="1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="false"/>

<fragment android:name="com.johko.jugendnetz_berlin.destellenangebote.List_Fragment"
    android:id = "@+id/feedListe"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
     />

Logcat说:

  11-21 21:30:49.848: E/AndroidRuntime(764): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(16908298, class android.widget.ListView) with Adapter(class com.johko.jugendnetz_berlin.destellenangebote.CustomAdapter)]

2 个答案:

答案 0 :(得分:0)

您似乎忘记通知列表适配器新数据。

尝试getListAdapter()。notifyDataSetChanged();添加/更改数据后。

答案 1 :(得分:0)

Logcat说您忘记告诉listwiew适配器的内容。 确保更改后,使用notifyDataSetChanged()进行调用。