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?
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.
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
Faites défiler vos listes plus rapidement: -
getView
de votre adaptateur.// 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)
{
}
}