web-dev-qa-db-ja.com

Android listview遅延読み込み

何かしたいです。 ListViewで遅延読み込みを行います。私のListViewには10,000以上のデータが含まれており、TextViewにのみ含まれています。そのため、リストアクティビティを起動したときに、最初にすべてのデータを読み込むことはできません。それは効率的ではないので、リストの最初の20または30アイテムをロードできます。さらに、ListViewの行は、それらをスクロールすると読み込まれます。したがって、最後のインデックスでListViewの最後のインデックスに到達すると、プログレスバーnを配置します。これにより、新しいデータが読み込まれることがわかります。そのため、新しいデータは、最後の+ 1インデックスで読み込まれます。これどうやってするの?

15
Jai

これは、無限のアダプター実装を使用して実現できます。これはまさにあなたが望んでいることです。スクロールごとに更新する行数を制限することもできます。ここへのリンクです。、

Android:Android Market のようなエンドレスリストのプログレスバーと「loading ...」の実装

https://github.com/commonsguy/cwac-endless

これを使用するには、EndlessAdapterを拡張して、無限を処理する方法の詳細を提供します。具体的には、別の方法でメインアダプターに実際のデータをロードするときにプレースホルダーとして機能する、実際のアダプターの行から独立した行ビューを提供できる必要があります。次に、少しの助けを借りて、新しいデータにシームレスに移行します。

18
Andro Selva

リストビューに 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 !!!
                }
            });
        }
    }

あなたは完全な実装を見つけることができます このリンクで

1
Neeraj

リストのスクロールを速くする:-

  1. アダプターのgetViewで使用される条件の数を減らします。
  2. ログに表示されるガベージコレクションの警告の数を減らす
  3. スクロール機能を追加(スクロールごとに更新される行数を制限)
1
Arshid KV

//関数を呼び出す:

@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)
    {

    }

}
0
sagar.shirsath