何かしたいです。 ListView
で遅延読み込みを行います。私のListView
には10,000以上のデータが含まれており、TextView
にのみ含まれています。そのため、リストアクティビティを起動したときに、最初にすべてのデータを読み込むことはできません。それは効率的ではないので、リストの最初の20または30アイテムをロードできます。さらに、ListView
の行は、それらをスクロールすると読み込まれます。したがって、最後のインデックスでListView
の最後のインデックスに到達すると、プログレスバーnを配置します。これにより、新しいデータが読み込まれることがわかります。そのため、新しいデータは、最後の+ 1インデックスで読み込まれます。これどうやってするの?
これは、無限のアダプター実装を使用して実現できます。これはまさにあなたが望んでいることです。スクロールごとに更新する行数を制限することもできます。ここへのリンクです。、
Android:Android Market のようなエンドレスリストのプログレスバーと「loading ...」の実装
https://github.com/commonsguy/cwac-endless
これを使用するには、EndlessAdapterを拡張して、無限を処理する方法の詳細を提供します。具体的には、別の方法でメインアダプターに実際のデータをロードするときにプレースホルダーとして機能する、実際のアダプターの行から独立した行ビューを提供できる必要があります。次に、少しの助けを借りて、新しいデータにシームレスに移行します。
リストビューに onScrollListener を追加します。ユーザーがスクロールするときに、ListViewが終わりに近づいているかどうかを確認します。はいの場合、さらにデータをフェッチします。例として:
public abstract class LazyLoader implements AbsListView.OnScrollListener {
private static final int DEFAULT_THRESHOLD = 10 ;
private boolean loading = true ;
private int previousTotal = 0 ;
private int threshold = DEFAULT_THRESHOLD ;
public LazyLoader() {}
public LazyLoader(int threshold) {
this.threshold = threshold;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(loading) {
if(totalItemCount > previousTotal) {
// the loading has finished
loading = false ;
previousTotal = totalItemCount ;
}
}
// check if the List needs more data
if(!loading && ((firstVisibleItem + visibleItemCount ) >= (totalItemCount - threshold))) {
loading = true ;
// List needs more data. Go fetch !!
loadMore(view, firstVisibleItem,
visibleItemCount, totalItemCount);
}
}
// Called when the user is nearing the end of the ListView
// and the ListView is ready to add more items.
public abstract void loadMore(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount);
}
活動:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
ListView listView = (ListView) findViewById(R.id.listView);
listView.setOnScrollListener(new LazyLoader() {
@Override
public void loadMore(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// Fetch your data here !!!
}
});
}
}
あなたは完全な実装を見つけることができます このリンクで
リストのスクロールを速くする:-
getView
で使用される条件の数を減らします。//関数を呼び出す:
@Override
public View onCreateView(Android.view.LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
ScrollListener scrollListener = new ScrollListener();
listView.setOnScrollListener(scrollListener);
}
そして内部クラス:
class ScrollListener implements OnScrollListener
{
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
int size = searchedPeople.size();
if(isScrolled && totalItemCount != 0 && size < totalPeoples)
{
if(firstVisibleItem + visibleItemCount >= totalItemCount)
{
yourfunction(size, size + limit); // call service in your functioin
isScrolled = false;
}
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
}
}