あなた:
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を開く
画像付きの表示 なども対応できます。希望があれば教えてください!