リストビューを下までスクロールしたときに、追加でリストを読み込みをする処理をAndroidで実装します。
Webで言うところの、オートページローディングに似た感じです。Infinite ScrollやjQuery.autopagerで実装する、あのクルクルです。
下記の記事が参考になりました。
visible true: ListViewで最後尾までスクロールしたら自動的に要素を追加読み込みするサンプル
http://visible-true.blogspot.jp/2010/12/listview.html
φ(.. )メモシテオコウ AndroidのListViewで最下部までスクロールしたらデータの更新する場合のめも - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ
http://kernhack.hatenablog.com/entry/2013/10/25/211637
注意:このサンプルプログラムでは、リストを選択したときの処理を入れていません。もし選択処理を入れるときには以下の記事を参考にしてください。
Android開発 LayoutInflaterを利用してListViewをカスタマイズする
http://takeshiyako.blogspot.com/2015/07/android-layoutinflater-listview.html
以下、サンプルプログラムです。
activity_main.xml
ListViewを追加します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" | |
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" | |
android:paddingRight="@dimen/activity_horizontal_margin" | |
android:paddingTop="@dimen/activity_vertical_margin" | |
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> | |
<ListView | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:id="@+id/listView" | |
android:layout_alignParentTop="true" | |
android:layout_alignParentLeft="true" | |
android:layout_alignParentStart="true" /> | |
</RelativeLayout> |
ListViewのフッターのクルクルです。
リストのアダプターを準備して、リストビューに渡すことろまでは普通です。
そのあと、フッターを追加後、スクロールのリスナーの部分を書いています。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package app.sample.listautoscroll; | |
import android.support.v7.app.ActionBarActivity; | |
import android.os.Bundle; | |
import android.view.Menu; | |
import android.view.MenuItem; | |
import android.view.View; | |
import android.widget.AbsListView; | |
import android.widget.ArrayAdapter; | |
import android.widget.ListView; | |
public class MainActivity extends ActionBarActivity { | |
// 1ページ辺りの項目数 | |
Integer per_page = 20; | |
// フッターのプログレスバー(クルクル) | |
View mFooter; | |
// 予報表示用リストビューのアダプター | |
ArrayAdapter<String> adapter; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_main); | |
// リスト用のアダプターを準備 | |
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); | |
// アダプターにアイテムを追加します | |
for (int i = 0; i < per_page; i++) { | |
adapter.add("リストビュー:" + i); | |
} | |
// リストビューへ紐付け | |
ListView listview = (ListView)findViewById(R.id.listView); | |
// リストビューにアダプターを設定します | |
listview.setAdapter(adapter); | |
// リストビューにフッターを追加 | |
listview.addFooterView(getFooter()); | |
// スクロールのリスナー | |
listview.setOnScrollListener(new AbsListView.OnScrollListener() { | |
// スクロール中の処理 | |
@Override | |
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { | |
// 最初とスクロール完了したとき | |
if ((totalItemCount - visibleItemCount) == firstVisibleItem) { | |
// アイテムの数 フッター分の1を引く | |
Integer ItemCount = totalItemCount - 1; | |
// アダプターにアイテムを追加します | |
for (int i = ItemCount; i < (ItemCount + per_page); i++) { | |
adapter.add("リストビュー:" + i); | |
} | |
} | |
} | |
// ListViewがスクロール中かどうか状態を返すメソッドです | |
@Override | |
public void onScrollStateChanged(AbsListView arg0, int arg1) { | |
} | |
}); | |
} | |
private View getFooter() { | |
if (mFooter == null) { | |
mFooter = getLayoutInflater().inflate(R.layout.listview_footer, null); | |
} | |
return mFooter; | |
} | |
@Override | |
public boolean onCreateOptionsMenu(Menu menu) { | |
// Inflate the menu; this adds items to the action bar if it is present. | |
getMenuInflater().inflate(R.menu.menu_main, menu); | |
return true; | |
} | |
@Override | |
public boolean onOptionsItemSelected(MenuItem item) { | |
// Handle action bar item clicks here. The action bar will | |
// automatically handle clicks on the Home/Up button, so long | |
// as you specify a parent activity in AndroidManifest.xml. | |
int id = item.getItemId(); | |
//noinspection SimplifiableIfStatement | |
if (id == R.id.action_settings) { | |
return true; | |
} | |
return super.onOptionsItemSelected(item); | |
} | |
} |