あなた:
android javaでRSSから取得したタイトルとURLをtextviewに表示したい
ChatGPT:
Android JavaでRSSから取得したタイトルとURLをTextViewに表示するには、以下のようなステップを踏む必要があります:
- RSSフィードを取得(HttpURLConnectionなど)
- XMLをパース(XmlPullParserなど)
- タイトルとリンク(URL)を取得
- 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 に表示します。
- parseRSS() で複数記事を取得(そのままでOK)
- List
から 1件だけランダムに選ぶ - 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を開く
画像付きの表示 なども対応できます。希望があれば教えてください!