web-dev-qa-db-fra.com

Android listview chargement paresseux

Je veux faire des trucs. Je veux faire un chargement paresseux dans ListView. Ma ListView contient plus de 10 000 données & seulement dans TextView. donc je ne peux pas charger toutes ces données dans la première fois quand je lance l'activité de la liste. ce n'est pas efficace, donc je peux charger les 20 ou 30 premiers articles de la liste. De plus, les rangées de la ListView sont chargées lorsque je les fais défiler. Ainsi, lorsque j'atteindrai le dernier index de ListView sur le dernier index, je mettrai progressbar n, il notera que les nouvelles données sont chargées. Ainsi, à ce moment, les nouvelles données seront chargées avec le dernier index + 1. Comment puis-je faire ceci?

13
Jai

Vous pouvez y parvenir en utilisant une implémentation sans fin de l'adaptateur. Cela fait exactement ce que vous voulez. Vous pouvez également limiter le nombre de lignes à actualiser par défilement. Voici un lien pour cela., 

Android: Implémentation de progressbar et "chargement ..." pour Endless List comme Android Market

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

Pour l'utiliser, vous étendez EndlessAdapter afin de fournir des détails sur la gestion de l'infini. Plus précisément, vous devez pouvoir fournir une vue de ligne, indépendante de l’une des lignes de votre adaptateur réel, qui servira d’espace réservé pendant que vous chargez, selon une autre méthode, les données réelles dans votre adaptateur principal. Ensuite, avec un peu d'aide de votre part, il effectue une transition transparente dans les nouvelles données.

19
Andro Selva

Ajoutez un onScrollListener à ListView. Lorsque l'utilisateur fait défiler, vérifiez si le ListView touche à sa fin. Si oui, récupérez plus de données. Par exemple :

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);
}

Activité: 

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 !!!
                }
            });
        }
    }

Vous pouvez trouver la mise en œuvre complète sur ce lien

1
Neeraj

Faites défiler vos listes plus rapidement: -

  1. Réduisez le nombre de conditions utilisées dans la getView de votre adaptateur.
  2. Réduisez le nombre d'avertissements relatifs à la récupération de place que vous obtenez dans les journaux.
  3. Ajouter une fonction de défilement (limiter le nombre de lignes à actualiser par défilement) 
1
Arshid KV

// met en appel la fonction:

@Override
public View onCreateView(Android.view.LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
  ScrollListener scrollListener = new ScrollListener();
  listView.setOnScrollListener(scrollListener);
}

et classe intérieure:

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