15

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

4

4 に答える 4

17

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

Android:Androidマーケットのようなエンドレスリストにプログレスバーと「読み込み中...」を実装する

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

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

于 2012-05-22T06:12:01.667 に答える
2

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

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

onScrollListenerをListViewに追加します。ユーザーがスクロールしたら、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 !!!
                }
            });
        }
    }

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

于 2016-05-26T19:11:20.737 に答える
0

//関数の呼び出しを入力します:

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

    }

}
于 2014-10-07T10:48:24.197 に答える