KDP(電子出版)のメモ 急急如律令

Amazon Kindleダイレクト・パブリッシングでの電子出版や電子書籍の作成販売について、文章やイラストの作成や編集方法について書いています。

android javaでRSSから取得したタイトルとURLをtextviewに表示したい

あなた:

android javaでRSSから取得したタイトルとURLをtextviewに表示したい

ChatGPT:

Android JavaでRSSから取得したタイトルとURLをTextViewに表示するには、以下のようなステップを踏む必要があります:

  1. RSSフィードを取得(HttpURLConnectionなど)
  2. XMLをパース(XmlPullParserなど)
  3. タイトルとリンク(URL)を取得
  4. TextViewに表示

RSSフィードを取得(HttpURLConnectionなど)

XMLをパース(XmlPullParserなど)

タイトルとリンク(URL)を取得

TextViewに表示

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private final String RSS_URL = "https://example.com/rss";  // ← 適宜変更

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textView);

        // RSS取得は別スレッドで
        new Thread(() -> {
            try {
                URL url = new URL(RSS_URL);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                InputStream inputStream = conn.getInputStream();

                List<String> titlesAndLinks = parseRSS(inputStream);

                // UIスレッドでTextView更新
                runOnUiThread(() -> {
                    StringBuilder builder = new StringBuilder();
                    for (String item : titlesAndLinks) {
                        builder.append(item).append("\n\n");
                    }
                    textView.setText(builder.toString());
                });

            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();
    }

    // RSSをパースしてタイトルとリンクのリストを返す
    private List<String> parseRSS(InputStream inputStream) throws XmlPullParserException, IOException {
        List<String> items = new ArrayList<>();

        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(inputStream, null);

        boolean insideItem = false;
        String title = null;
        String link = null;

        int eventType = parser.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            String name = parser.getName();

            if (eventType == XmlPullParser.START_TAG) {
                if (name.equalsIgnoreCase("item")) {
                    insideItem = true;
                } else if (insideItem && name.equalsIgnoreCase("title")) {
                    title = parser.nextText();
                } else if (insideItem && name.equalsIgnoreCase("link")) {
                    link = parser.nextText();
                }

            } else if (eventType == XmlPullParser.END_TAG && name.equalsIgnoreCase("item")) {
                if (title != null && link != null) {
                    items.add("■ " + title + "\n" + link);
                }
                title = null;
                link = null;
                insideItem = false;
            }

            eventType = parser.next();
        }

        return items;
    }
}
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:textSize="16sp"
        android:lineSpacingExtra="4dp" />
</ScrollView>
  • RSS URLは正確なURLに書き換えてください。
  • ネットワークアクセスには インターネットパーミッションが必要です:

RSS URLは正確なURLに書き換えてください。

ネットワークアクセスには インターネットパーミッションが必要です:

<uses-permission android:name="android.permission.INTERNET" />
  • AsyncTask や Handler に置き換えることも可能。
  • 表示を RecyclerView にすれば見やすくカスタマイズできます。

AsyncTask や Handler に置き換えることも可能。

表示を RecyclerView にすれば見やすくカスタマイズできます。

興味があれば、RecyclerView 版やクリックでURLを開くバージョンも用意できますよ!

あなた:

RSSからランダムに一記事だけ取得するように変更したい

ChatGPT:

OK!RSSからランダムに1記事だけを取得してTextViewに表示するようにコードを変更してみましょう!

以下では、すでに取得したタイトルとURLのリストから 1件だけランダムに選んで TextView に表示します。

  1. parseRSS() で複数記事を取得(そのままでOK)
  2. List から 1件だけランダムに選ぶ
  3. TextView に表示

parseRSS() で複数記事を取得(そのままでOK)

List<String> から 1件だけランダムに選ぶ

TextView に表示

// ...(省略)

new Thread(() -> {
    try {
        URL url = new URL(RSS_URL);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        InputStream inputStream = conn.getInputStream();

        List<String> titlesAndLinks = parseRSS(inputStream);

        if (!titlesAndLinks.isEmpty()) {
            // ランダムに1件だけ選ぶ
            Random random = new Random();
            String randomItem = titlesAndLinks.get(random.nextInt(titlesAndLinks.size()));

            runOnUiThread(() -> textView.setText(randomItem));
        } else {
            runOnUiThread(() -> textView.setText("記事が見つかりませんでした。"));
        }

    } catch (Exception e) {
        e.printStackTrace();
        runOnUiThread(() -> textView.setText("エラーが発生しました。"));
    }
}).start();

タイトルとURLを List<String> に格納する関数は変えなくて大丈夫です。

■ 今日のニュースタイトル
https://example.com/article123
  • 毎回アプリを開くたびに違う記事を見せるようになります。
  • より動的にしたいなら「ボタンを押してランダム表示」もできます(必要なら追加でコード出します)。

毎回アプリを開くたびに違う記事を見せるようになります。

より動的にしたいなら「ボタンを押してランダム表示」もできます(必要なら追加でコード出します)。

必要なら:

  • RecyclerView への拡張
  • タイトルのみを表示 → タップでURLを開く
  • 画像付きの表示 なども対応できます。希望があれば教えてください!

RecyclerView への拡張

タイトルのみを表示 → タップでURLを開く

画像付きの表示 なども対応できます。希望があれば教えてください!