Android динамически загружает ListView

  • I am adding item in ListView using ArrayAdapter.
    • First display 15 item in the ListView.
    • Прокрутите вниз, чтобы получить и отобразить следующие 15 контентов из веб-API.

Дайте какую-нибудь идею.


person Jeeva    schedule 12.07.2011    source источник


Ответы (4)


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

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

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

https://github.com/thest1/LazyList

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

[Спасибо исходному автору кода и учебника]

person Hein    schedule 12.07.2011
comment
Это что-то другое. В примере показано, как лениво загружать изображения с предопределенными элементами. Джива спросила, как динамически добавлять элементы в конец списка. - person Plamen Nikolov; 12.07.2011

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


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

            if(((firstVisibleItem + visibleItemCount) == totalItemCount) && (totalItemCount > 0)) {
                loadNewData();
            }
        }
person Plamen Nikolov    schedule 12.07.2011
comment
Я чувствую, что мне нужно прокомментировать здесь не для того, чтобы подорвать этот ответ, а для того, чтобы предупредить людей о недостатках использования onScroll. Я тестировал его, так как мне нужен механизм, который динамически загружает данные, и я заметил одну вещь: если пользователь слишком быстро выбрасывает список, код может никогда не запуститься. Это конечно проблема. В моем случае мне нужно иметь возможность динамически загружать список, даже когда пользователь бросает. Если вы просто хотите загрузить после конца или начала списка, то этот ответ подойдет. Но хотелось бы сэкономить людям некоторое время, если они пойдут по этому пути, и это ограничение вызывает проблему :) - person Andy; 12.11.2013

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

person Ben Lee    schedule 12.07.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; }
}
person Hussain    schedule 12.07.2011