簡體   English   中英

如何在Android中的ListView中顯示已解析的html

[英]How to display parsed html in a ListView in Android

我正在嘗試使用jsoup解析來自網站的新聞標題並將其顯示在ListView中。 我很久以來一直在嘗試解決這個問題,並且瘋狂地谷歌搜索,但是我無法解決我的問題或找到有效的解決方案。 我有一個自定義類,其中包含兩個變量,即新聞標題和文章鏈接。 似乎一切解析都很好,但我只是無法正確顯示或完全不顯示ListView ...它不斷崩潰,並接縫着每當我遇到另一個錯誤時。 也許我對自己太難了。 我很沮喪,不能再邏輯思考了……我將不勝感激所有提示或有用的答案。

提要類別:

public class Feeds {

private String mNewsTitle;
private String mNewsLink;

public Feeds(String newsTitle, String newsLink){
    mNewsTitle = newsTitle;
    mNewsLink = newsLink;
 }

public String getNewsTitle(){
    return mNewsTitle;
 }

public void setNewsTitle(String newsTitle){
    mNewsTitle = newsTitle;
 }

public String getNewsLink(){
    return mNewsLink;
 }

public void setNewsLink(String newsLink){
    mNewsTitle = newsLink;
 }
}

NewsFeeds類:

public class NewsFeeds extends ListActivity {

private ArrayList<Feeds> mFeedDB = new ArrayList<Feeds>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_news_feeds);

    HtmlParser htmlThread = new HtmlParser();
    htmlThread.execute();


} // end on create

public class HtmlParser extends AsyncTask<Void, Integer, ArrayList<Feeds>> {

    private static final int NETWORK_NO_ERROR = -1;
    private static final int NETWORK_HOST_UNREACHABLE = 1;
    private static final int NETWORK_NO_ACCESS_TO_INTERNET = 2;
    private static final int NETWORK_TIME_OUT = 3;

    Integer serverError = NETWORK_NO_ERROR;

    ProgressDialog dialog;

    protected void onPreExecute() {
        // example of setting up something
        dialog = new ProgressDialog(NewsFeeds.this);
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        dialog.setMessage("Retrieving News Feeds");
        dialog.show();
    } // end onPreExecute

    @Override
    protected ArrayList<Feeds> doInBackground(Void... params) {
        try {
            // need http protocol
            Document doc = Jsoup.connect("http://baseball-potsdam.de/news")
                    .get();

            // get news feed titles
            Elements newsFeed = doc.getElementsByClass("gdlr-blog-title");

            // get all links
            Elements links = newsFeed.select("a[href]");


            for (Element link : links) {
                // populate ArrayList with news titles and links
                mFeedDB.add(new Feeds(link.text(), link.attr("href")));
            }

            return mFeedDB;

            // } catch (IOException e) {
            // e.printStackTrace();
        } catch (ConnectException e) {
            serverError = NETWORK_NO_ACCESS_TO_INTERNET;
            return null;
        } catch (UnknownHostException e) {
            serverError = NETWORK_HOST_UNREACHABLE;
            return null;
        } catch (SocketTimeoutException e) {
            serverError = NETWORK_TIME_OUT;
            return null;
        } catch (IOException e) {
            e.printStackTrace();
        } // end try catch
        return null;

    } // end doInBackground

    protected void onProgressUpdate(Integer... progress) {

    } // end onProgressUpdate

    protected void onPostExecute(ArrayList<Feeds> result) {
        if (result != null) {

            ListView listview = (ListView) findViewById(R.id.list_view_news_feeds);
            listview.setAdapter(new ArrayAdapter<Feeds>(NewsFeeds.this, android.R.layout.simple_list_item_1 , mFeedDB));


            if (dialog.isShowing()) {
                dialog.dismiss();
            } // end if
        } else {
            switch (serverError) {
            case NETWORK_NO_ERROR:
                Toast.makeText(NewsFeeds.this,
                        "Probably, invalid response from server",
                        Toast.LENGTH_LONG).show();
                break;
            case NETWORK_NO_ACCESS_TO_INTERNET:
                // You can customize error message (or behavior) for
                // different type of error
            case NETWORK_TIME_OUT:
            case NETWORK_HOST_UNREACHABLE:
                Toast.makeText(NewsFeeds.this, "Error in Connection",
                        Toast.LENGTH_LONG).show();
                break;
            }
        } // end if else
        } // end onPostExecute
    } // end HtmlParser class
} // end NewsFeeds

activity_news_feeds.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >   

    <ListView
        android:id="@+id/list_view_news_feeds"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" 
        android:dividerHeight="0.1dp"
        android:divider="#0000CC"
    />
</LinearLayout>

NewsManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kylehopeman.android.porcupinesnews"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.INTERNET" />"

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.kylehopeman.android.porcupinesnews.MainMenu"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name="com.kylehopeman.android.porcupinesnews.NewsFeeds"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="com.kylehopeman.android.porcupinesnews.NewsFeeds" />
             <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>      
    </application>
</manifest>

如果您在使用ListView時遇到錯誤,則看起來它僅在postExecute塊中實例化。 是否可以在onCreate()上實例化它,並在聲明mFeedDB的地方聲明它?

將NewsNewFeeds.java文件中的第一行從以下位置更改后:

public class NewsFeeds extends ListActivity

至:

public class NewsFeeds extends Activity

錯誤消失了,應用程序像我希望的那樣編譯並運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM