- 我使用ArrayAdapter在ListView中添加项目。
- 首先在ListView中显示15个项目。
- 滚动到底部,它必须从Web API中获取并显示接下来的15个内容。
给点意见。Android动态加载ListView
给点意见。Android动态加载ListView
有一个延迟加载图像的教程。你应该检查出
http://ballardhack.wordpress.com/2010/04/05/loading-remote-images-in-a-listview-on-android/
这里是从GitHub懒列表视图的一些演示。
https://github.com/thest1/LazyList
希望这些可以帮助!
[信用转至代码和教程原作者]
设置OnScrollListener。检查有多少元素可见,哪些是第一个可见元素。
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(((firstVisibleItem + visibleItemCount) == totalItemCount) && (totalItemCount > 0)) {
loadNewData();
}
}
我觉得我需要在这里评论不破坏这个答案,但以警告下行人使用'onScroll'。我一直在测试它,因为我需要一种动态加载数据的机制,而且我注意到的一件事是,如果用户快速地将列表反过来,代码可能永远不会运行。这当然是一个问题。在我的情况下,我需要能够动态加载列表,即使用户甩手。如果你只是想在列表结束或开始之后加载,那么这个答案就好了。但是,如果他们走这条路线,并希望节省一些时间,这个限制会导致问题:) – Andy
getView()
getView()
将在项目可见时调用。 因此,您可以在getView(14, convertView, parent)
时开始提取并显示下一个15。
从互联网加载数据是一项耗时的任务。所以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; }
}
这是不同的。该示例显示如何使用预定义元素加载图像“懒惰”。 Jeeva询问如何动态添加元素到列表的底部。 –