[Android Studio] ListViewで最後までスクロールしたら新たなリストを追加する

どうも、tatsuです!

今日は、ListViewで最後までスクロールしたら新たなリストを追加する方法を説明します。

※この記事で使用しているAndroid Studioのバージョンは2.3.3です。

ListViewで最後までスクロールしたら新たなリストを追加する

ListViewで最後までスクロールしたら新たなリストを追加するには、以下のように記述します。

activity_main.xml

activity_main.xmlは以下のようにします。

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

MainActivity.java

MainActivity.javaは以下のようにします。

public class MainActivity extends AppCompatActivity {

    // newNoodleの1-30が追加されたかどうかのフラグ true:追加された false:まだ追加されてない
    boolean newNoodleAddFlag = false;

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

        // ListViewに表示する項目を生成
        ArrayList<String> noodleList= new ArrayList<>();
        for(int i = 1; i <= 30; i++){
            noodleList.add("noodle : " + i);
        }

        // Adapterを生成
        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, noodleList);

        // idがlistのListViewを取得
        ListView listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(arrayAdapter);

        // スクロールイベントリスナーを設定
        listView.setOnScrollListener(new AbsListView.OnScrollListener(){

            // スクロールされている間に発火
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                // 今回は実装しない
            }

            /**
             * スクロールが完了したタイミングで発火
             * @param view スクロールするListView
             * @param firstVisibleItem 先頭項目のインデックス(添え字)
             * @param visibleItemCount 表示している項目数
             * @param totalItemCount 項目総数
             */
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                // 最後までスクロールしている かつ 一回もnewNoodleを追加していなければ 追加
                if(firstVisibleItem + visibleItemCount == totalItemCount && !newNoodleAddFlag){
                    for(int i = 1; i <= 30; i++){
                        arrayAdapter.add("newNoodle : " + i);
                    }
                    newNoodleAddFlag = true;
                }
            }
        });
    }

}

結果

↓スクロール前

↓スクロール後

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です