1
  • 我使用ArrayAdapter在ListView中添加项目。
    • 首先在ListView中显示15个项目。
    • 滚动到底部,它必须从Web API中获取并显示接下来的15个内容。

给点意见。Android动态加载ListView

回答

2

设置OnScrollListener。检查有多少元素可见,哪些是第一个可见元素。


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

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

我觉得我需要在这里评论不破坏这个答案,但以警告下行人使用'onScroll'。我一直在测试它,因为我需要一种动态加载数据的机制,而且我注意到的一件事是,如果用户快速地将列表反过来,代码可能永远不会运行。这当然是一个问题。在我的情况下,我需要能够动态加载列表,即使用户甩手。如果你只是想在列表结束或开始之后加载,那么这个答案就好了。但是,如果他们走这条路线,并希望节省一些时间,这个限制会导致问题:) – Andy

2

getView()getView()将在项目可见时调用。 因此,您可以在getView(14, convertView, parent)时开始提取并显示下一个15。

1

从互联网加载数据是一项耗时的任务。所以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; } 
}