【Android】RecyclerViewのアダプタデータを動的に更新する方法を徹底解説
はじめに
この記事では、Androidアプリ開発においてRecyclerViewのアダプタデータを動的に更新する方法を、実際のサンプルコードとともにステップごとに解説します。リストに新しいデータを追加した際に画面へ即座に反映させる仕組みは、チャットアプリやTODOリストなど、さまざまな場面で活用できる重要なテクニックです。
手順1:新規プロジェクトを作成する
まず、Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目をすべて入力してプロジェクトを作成してください。
手順2:activity_main.xmlにレイアウトを定義する
次に、res/layout/activity_main.xmlに以下のコードを追加します。
<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android"
android:orientation = "vertical"
android:layout_width = "match_parent"
android:gravity = "center"
android:layout_height = "wrap_content">
<android.support.v7.widget.RecyclerView
android:id = "@+id/recycler_view"
android:layout_width = "match_parent"
android:layout_height = "400dp"
android:scrollbars = "vertical" />
<TextView
android:id = "@+id/text"
android:textSize = "30sp"
android:text = "Update"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content" />
</LinearLayout>
上記のコードでは、画面中央にRecyclerViewと、「Update」と表示されるTextViewを縦方向(vertical)に配置しています。このTextViewをタップすることで、後ほどリストのデータ更新を行います。
手順3:MainActivity.javaにロジックを実装する
続いて、src/MainActivity.javaに以下のコードを追加します。
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends Activity {
private RecyclerView recyclerView;
private customAdapter mAdapter;
TextView text;
ArrayList<String> list = new ArrayList<>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
mAdapter = new customAdapter(this,list);
recyclerView.setAdapter(mAdapter);
recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL));
list.add("sairamm");
list.add("Krishna");
list.add("prasad");
text = findViewById(R.id.text);
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
list.add("Mammahe");
mAdapter.notifyDataSetChanged();
}
});
}
}
このコードのポイントは以下の通りです。
- LinearLayoutManagerを使用して、RecyclerViewを縦スクロールのリスト形式で表示
- DividerItemDecorationにより、各項目間に区切り線を描画
- 初期データとして「sairamm」「Krishna」「prasad」の3件を追加
- TextViewをクリックすると、リストに「Mammahe」を追加し、
notifyDataSetChanged()を呼び出してRecyclerViewの表示を即座に更新
手順4:customAdapter.javaを作成する
次に、src/customAdapter.javaというアダプタクラスを作成し、以下のコードを追加します。
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
public class customAdapter extends RecyclerView.Adapter<customAdapter.MyViewHolder> {
Context context;
ArrayList<String> list;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView title;
public MyViewHolder(View view) {
super(view);
title = (TextView) view.findViewById(R.id.title);
}
}
public customAdapter(Context context, ArrayList<String> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_row, viewGroup, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
myViewHolder.title.setText(list.get(i));
}
@Override
public int getItemCount() {
return list.size();
}
}
アダプタクラスでは、onCreateViewHolder()で行のレイアウトを生成し、onBindViewHolder()で各位置のデータをTextViewにセットしています。getItemCount()はリストのサイズを返すことで、表示する項目数を決定します。
手順5:list_row.xmlで行レイアウトを定義する
最後に、リストの各行の見た目を決めるres/layout/list_row.xmlを作成し、以下のコードを追加します。
<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android"
android:orientation = "vertical" android:layout_width = "match_parent"
android:layout_height = "wrap_content">
<TextView
android:id = "@+id/title"
android:layout_width = "wrap_content"
android:textSize = "30sp"
android:layout_marginLeft = "10dp"
android:layout_height = "wrap_content" />
</LinearLayout>
アプリを実行して動作を確認する
それでは、アプリケーションを実行してみましょう。ここでは、実機のAndroidスマートフォンをパソコンに接続していることを前提とします。Android Studioからアプリを実行するには、プロジェクト内のいずれかのアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックします。デバイス選択ダイアログで自分のモバイル端末を選択すると、端末に以下のような初期画面が表示されます。

次に、画面下部の「Update」と書かれたTextViewをクリックしてみてください。リストに新しい項目「Mammahe」が追加され、以下のように画面へ即座に反映されます。

補足:AndroidXへの移行について
本記事のサンプルコードは旧サポートライブラリ(android.support)を使用していますが、現在のAndroid StudioではAndroidXの利用が標準となっています。新規プロジェクトで試す場合は、import文を以下のように読み替えてください。
android.support.v7.widget.RecyclerView→androidx.recyclerview.widget.RecyclerViewandroid.app.Activity→androidx.appcompat.app.AppCompatActivity(推奨)
また、より効率的な部分更新を行いたい場合は、notifyDataSetChanged()の代わりにnotifyItemInserted(position)を使うと、変更された項目だけを再描画でき、パフォーマンスの向上が期待できます。
-
Androidでアプリを更新する方法|自動更新と手動更新の設定ガイド
Androidのアプリは、開発者によって機能改善を目的としたアップデートが定期的に配信されています。アップデートには、動作の安定性やパフォーマンスの向上に加えて、セキュリティ修正が含まれることも少なくありません。デフォルトではAndroidアプリは自動的に更新されるようになっていますが、実は「いつ」「どのように」更新するかをユーザー自身である程度コントロールできることをご存じない方も多いはず。この記事では、Androidでアプリを自動更新する方法と手動更新する方法を詳しく解説します。 Androidでアプリを自動更新する方法 アプリの自動更新を有効にしておけば、新しいバージョンがリリース
-
Androidのデータバインディング入門:Data Binding Libraryでレイアウトとデータを結びつける方法
データバインディングとは、アプリが扱う「データ」と、画面上の視覚的なUI要素を結びつける(バインドする)ための手法です。この仕組みを使うと、UI側の値が更新されるたびに、裏側で保持しているデータも自動的に更新されます。 決して目新しい概念ではなく、AngularJS、React、Vueなど、多くのフロントエンドフレームワークがすでにこの仕組みを設計に取り入れています。 しかし本記事で注目するのはフロントエンドフレームワークではなく、モバイル開発です。GoogleはAndroid向けにData Binding Libraryを提供しており、これはAndroid Jetpackの一部として位置づけ