ListView senza fine di scorrimento

Sto popolando un ListView con i dati recuperati da un servizio online, che fornisce i dati nelle pagine. Anziché fornire un button "pagina successiva", sto tentando di caricare automaticamente la pagina successiva dei dati quando l'utente scorre vicino alla parte inferiore della pagina.

I dati vengono recuperati utilizzando un AsyncTask:

  • Android Layout Tabbed setContent
  • Avviso di Google Play: la tua applicazione potrebbe perdere le credenziali dello sviluppatore
  • Android non può aggiungere il button di ricerca al menu delle opzioni
  • Cookies & Webview - CookieSyncManager in Android!
  • Menu di overflow personalizzato di Android (senza barra di azione e nessun menubutton)
  • È ansible realizzare tempo per fondere applicazioni Android?
  • class RecentTracksTask extends AsyncTask<Integer, Void, Void> { ArrayList<Track> recentTracks; @Override protected Void doInBackground(Integer... page) { try { // Get a page of 15 tracks // Simplified - getPage accepts 'page' and 'limit' parameters and returns a Collection<Track> recentTracks = new ArrayList<Track>(getPage(page[0], 15)); } catch () {} return null; } @Override protected void onPostExecute(Void result) { TracksAdapter mTracksAdapter = new TracksAdapter(getActivity(), recentTracks); ListView listView = (ListView) getActivity().findViewById(R.id.listview); listView.setAdapter(mTracksAdapter); listView.setOnScrollListener(new EndlessScrollListener()); } } 

    E l'adattatore:

     class TracksAdapter extends ArrayAdapter<Track> { private final Context context; private final ArrayList<Track> tracks; public TracksAdapter(Context context, ArrayList<Track> recentTrackArrayList) { super(context, 0, recentTrackArrayList); this.context = context; this.tracks = recentTrackArrayList; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.list_item, parent, false); } final Track track = tracks.get(position); final TextView tv = (TextView) convertView .findViewById(R.id.tv); // Repeat for other views tv.setText(track.getName()); // Repeat for other views return convertView; } } 

    Da qui ho provato questo EndlessScrollListener:

     class EndlessScrollListener implements AbsListView.OnScrollListener { private int visibleThreshold = 5; private int currentPage = 0; private int previousTotal = 0; private boolean loading = true; public EndlessScrollListener() { } public EndlessScrollListener(int visibleThreshold) { this.visibleThreshold = visibleThreshold; } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (loading) { if (totalItemCount > previousTotal) { loading = false; previousTotal = totalItemCount; currentPage++; } } if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) { // I load the next page of gigs using a background task, // but you can call any function here. new RecentTracksTask().execute(currentPage + 1); loading = true; } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } } 

    Ho cercato di semplificare il codice quanto più ansible senza rimuovere nulla di utile, ma so che è ancora un po 'lungo da leggere.

    Nel frammento di onCreateView, chiamo new RecentTracksTask().execute(1); che carica i primi 15 elementi nel ListView. Quando si scorre vicino alla parte inferiore del ListView, l'integer contenuto viene sostituito dalla seconda pagina e la visualizzazione viene restituita in cima all'elenco. Ripetere questo solo mi sposta in cima all'elenco, visualizzando ancora la seconda pagina.

    • Come posso ottenerlo in modo che la n ° pagina degli elementi sia inserita nella parte inferiore dell'elenco piuttosto che sostituire l'elenco?
    • Come posso impedirlo di spostare la vista in cima all'elenco?

    Grazie in anticipo!

  • Cursor.getType () per Livello API <11
  • Phonegap Plugin di contatti per contatti di Android (aggiornamento di un plugin)
  • Come catturare il contenuto dello schermo del dispositivo android?
  • Come impostare l'android: layout_alignParentLeft attributo a imageview nel codice?
  • Integrazione di Yahoo in Android
  • Come gestire il buffer di indice in OpenGL ES 1.1
  • One Solution collect form web for “ListView senza fine di scorrimento”

    Innanzitutto, sbarazzarsi dell'EndlessScrollListener. Quindi, aggiornare l'AsyncTask per recuperare i dati, aggiungerlo alla scheda già in uso e notificare all'adattatore la modifica del set di dati. Infine, nell'adattatore, aggiungere un controllo se arriva alla fine dell'elenco e richiedi la pagina successiva. Dovrei tuttavia avvisare che si desidera tenere traccia del proprio task asincroce e impedirgli di ricreare se si scorra l'ultima vista in posizione mentre è già caricata.

    AsyncTask

     class RecentTracksTask extends AsyncTask<Integer, Void, Void> { ArrayList<Track> recentTracks; @Override protected Void doInBackground(Integer... page) { try { // Get a page of 15 tracks // Simplified - getPage accepts 'page' and 'limit' parameters and returns a Collection<Track> recentTracks = new ArrayList<Track>(getPage(page[0], 15)); } catch () {} return null; } @Override protected void onPostExecute(Void result) { ListView listView = (ListView) getActivity().findViewById(R.id.listview); ArrayAdapter adapter = (ArrayAdapter) listView.getAdapter(); if(adapter == null) { adapter = new TracksAdapter(getActivity(), recentTracks); listView.setAdapter(adapter); } else { adapter.addAll(recentTracks); adapter.notifyDataSetChanged(); } } } 

    Adattatore:

     class TracksAdapter extends ArrayAdapter<Track> { private final Context context; private final ArrayList<Track> tracks; private int currentPage = 0; public TracksAdapter(Context context, ArrayList<Track> recentTrackArrayList) { super(context, 0, recentTrackArrayList); this.context = context; this.tracks = recentTrackArrayList; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.list_item, parent, false); } final Track track = tracks.get(position); final TextView tv = (TextView) convertView .findViewById(R.id.tv); // Repeat for other views tv.setText(track.getName()); // Repeat for other views //Check if we're at the end of the list if(position == getCount() - 1) { currentPage++; new RecentTracksTask().execute(currentPage); } return convertView; } } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.