1
  • ArrayAdapterを使用してListViewに項目を追加しています。
    • ListViewの最初の15項目を表示します。
    • 下にスクロールすると、Web APIから次の15コンテンツを取得して表示する必要があります。

いくつか考えてください。Android ListViewを動的にロードする

答えて

2

画像付きの遅延読み込みのチュートリアルがあります。あなたはここに

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

はGitHubのから怠惰なリストビューのいくつかのデモであることをチェックアウトする必要があります。

https://github.com/thest1/LazyList

はそれらが役立つことを願って!私はこの答えを弱体化するのではなく、 `onScroll`を使用するマイナス面について人々に警告していないここにコメントする必要がありますように

[クレジットは、コードやチュートリアルのオリジナルの著者に行く]

+3

これは異なるものです。この例は、あらかじめ定義された要素で画像を「怠惰」に読み込む方法を示しています。 Jeevaはリストの一番下に要素を動的に追加する方法を尋ねました。 –

2

OnScrollListenerを設定します。最初に表示される要素の数を確認します。


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

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

は、私は感じています。私は、データを動的にロードするメカニズムが必要なので、私はそれをテストしてきました。ユーザーがリストをあふれさせすぎてコードが決して動かないかもしれないということに気づいたことがあります。これはもちろん問題です。私の場合、ユーザーが飛んでもリストを動的にロードできる必要があります。リストの最後か最初の部分の後にロードしたいだけなら、この答えはうまくいきます。しかし、このルートに行くと、この制限が問題を引き起こす場合、人々を少し時間を節約したいです:) – Andy

2

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; } 
} 
関連する問題