1
  • J'ajoute un élément dans ListView en utilisant ArrayAdapter.
    • Afficher d'abord 15 élément dans le ListView.
    • Faites défiler vers le bas, il doit chercher et afficher les 15 prochains contenus de l'API Web.

donner une idée.Android charge dynamiquement ListView

Répondre

2

Il existe un tutoriel de chargement paresseux avec image. Vous devriez vérifier cela

http://ballardhack.wordpress.com/2010/04/05/loading-remote-images-in-a-listview-on-android/

Voici quelques démo de listview paresseux de GitHub.

https://github.com/thest1/LazyList

Espoir ceux-ci peuvent aider !!

[go de crédit à l'auteur original du code et tutoriel]

+3

Ceci est quelque chose de différent. L'exemple montre comment charger des images "paresseuses" avec des éléments prédéfinis. Le Jeeva a demandé comment ajouter dynamiquement des éléments au bas de la liste. –

2

défini sur OnScrollListener. Vérifiez combien d'éléments sont visibles, ce qui est le premier élément visible.


@Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

      if(((firstVisibleItem + visibleItemCount) == totalItemCount) && (totalItemCount > 0)) { 
       loadNewData(); 
      } 
     } 
+0

Je sens que je dois commenter ici de ne pas porter atteinte à cette réponse, mais pour avertir les gens au sujet de l'inconvénient à utiliser 'onScroll'. Je l'ai testé car j'ai besoin d'un mécanisme qui charge les données dynamiquement, et une chose que j'ai remarquée est que si un utilisateur lance la liste trop vite, le code peut ne jamais fonctionner. Ceci est bien sûr un problème. Dans mon cas, je dois être capable de charger dynamiquement la liste même lorsqu'un utilisateur flashe. Si vous voulez juste charger après la fin ou le début d'une liste, alors cette réponse est très bien. Mais j'aimerais épargner aux gens un peu de temps s'ils suivent cette voie et cette limitation cause un problème :) – Andy

2

getView() de l'adaptateur sera appelée lorsqu'un élément est visible. Ainsi, vous pouvez commencer la récupération et afficher les 15 suivants lorsque getView(14, convertView, parent).

1

C'est une tâche fastidieuse de charger des données à partir d'Internet. AsyncTask est donc implémenté pour gérer le ListView le bitmap est également chargé dans le thread d'arrière-plan que vous pouvez ignorer et prendre les autres, et setListAdapter() dans onPostExecute().

import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.net.URLConnection; 

import android.app.ListActivity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

    public class AndroidList extends ListActivity { 

    public class backgroundLoadListView extends AsyncTask { 

     @Override protected void onPostExecute(Void result) { 
// TODO Auto-generated method stub 
setListAdapter(new MyCustomAdapter(AndroidList.this, R.layout.row, month)); Toast.makeText(AndroidList.this,  "onPostExecute n: setListAdapter after bitmap preloaded",  Toast.LENGTH_LONG).show(); 
} 

     @Override protected void onPreExecute() { 
// TODO Auto-generated method stub 
Toast.makeText(AndroidList.this,  "onPreExecute n: preload bitmap in AsyncTask",  Toast.LENGTH_LONG).show(); 
} 

     @Override protected Void doInBackground(Void... params) { 
// TODO Auto-generated method stub 
preLoadSrcBitmap(); 
return null; 
} 

} 

    String image_URL= "http://androidboss.com/wp-content/uploads/2010/07/83e268b443ndroid.png.png"; 

public class MyCustomAdapter extends ArrayAdapter { 
Bitmap bm; 

     public MyCustomAdapter(Context context, int textViewResourceId, String[] objects) 
{ 
super(context, textViewResourceId, objects); 
// TODO Auto-generated constructor stub 

     bm = srcBitmap; 
    } 

     @Override public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
//return super.getView(position, convertView, parent); 

     View row = convertView; 

     if(row==null){ LayoutInflater inflater=getLayoutInflater(); row=inflater.inflate(R.layout.row, parent, false); 
} 

     TextView label=(TextView)row.findViewById(R.id.weekofday); label.setText(month[position]); ImageView icon=(ImageView)row.findViewById(R.id.icon); 

     icon.setImageBitmap(bm); 

     return row; 
} 
} 

    Bitmap srcBitmap; 
private void preLoadSrcBitmap() 
{ 
BitmapFactory.Options bmOptions; 
    bmOptions = new BitmapFactory.Options(); 
bmOptions.inSampleSize = 1; 
srcBitmap = LoadImage(image_URL, bmOptions); 
} 

    String[] month = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; 

    /** Called when the activity is first created. */ 
@Override public void onCreate(Bundle savedInstanceState) 
{ 
super.onCreate(savedInstanceState); 
    //setContentView(R.layout.main); 

     /*setListAdapter(new ArrayAdapter(this,  R.layout.row, R.id.weekofday, DayOfWeek));*/ new backgroundLoadListView().execute(); 
} 

    @Override protected void onListItemClick(ListView l, View v, int position, long id) 
{ 
// TODO Auto-generated method stub 
//super.onListItemClick(l, v, position, id); 
    String selection = l.getItemAtPosition(position).toString(); 
Toast.makeText(this, selection, Toast.LENGTH_LONG).show(); 
    } 

    private Bitmap LoadImage(String URL, BitmapFactory.Options options) {  
    Bitmap bitmap = null; 
InputStream in = null;  
try { 
    in = OpenHttpConnection(URL); 
bitmap = BitmapFactory.decodeStream(in, null, options); in.close(); 
    } catch (IOException e1) 
{ } 

     return bitmap;     } 

    private InputStream OpenHttpConnection(String strURL) throws IOException{ 
InputStream inputStream = null; 
URL url = new URL(strURL); 
URLConnection conn = url.openConnection(); 

     try{ 
    HttpURLConnection httpConn = (HttpURLConnection)conn; 
httpConn.setRequestMethod("GET"); 
httpConn.connect(); 

     if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) { 
inputStream = httpConn.getInputStream(); 
    } 
    } catch (Exception ex){ } 

     return inputStream; } 
}