Android динамически загружает ListView - PullRequest
1 голос
/ 12 июля 2011
  • Я добавляю элемент в ListView, используя ArrayAdapter.
    • Сначала отобразить 15 элементов в ListView.
    • Прокрутите вниз, чтобы загрузить и отобразить следующие 15 материалов из веб-API.

Дайте некоторое представление.

Ответы [ 4 ]

3 голосов
/ 12 июля 2011

Есть учебник ленивой загрузки с изображением.Вы должны проверить это

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

Вот некоторая демонстрация ленивого просмотра списка от GitHub.

https://github.com/thest1/LazyList

Надеюсь, что они могут помочь!!

[Предоставлено автором кода и учебника]

2 голосов
/ 12 июля 2011

getView() адаптера будет вызываться, когда элемент виден.Таким образом, вы можете начать выборку и отобразить следующие 15, когда getView(14, convertView, parent).

2 голосов
/ 12 июля 2011

установить OnScrollListener. Проверьте количество видимых элементов, которое является первым видимым элементом.


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

            if(((firstVisibleItem + visibleItemCount) == totalItemCount) && (totalItemCount > 0)) {
                loadNewData();
            }
        }
1 голос
/ 12 июля 2011

Это трудоемкая задача для загрузки данных из интернета.Таким образом, AsyncTask реализован для обработки ListView, растровое изображение также загружается в фоновом потоке, который вы можете игнорировать и принимать другие, и setListAdapter() в 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; }
}
...