【问题标题】:Android Dynamically Load ListViewAndroid 动态加载 ListView
【发布时间】:2011-10-03 09:53:35
【问题描述】:
  • 我正在使用 ArrayAdapter 在 ListView 中添加项目。
    • 首先在 ListView 中显示 15 项。
    • 滚动到底部,它必须从 Web API 获取并显示接下来的 15 个内容。

给点意见。

【问题讨论】:

    标签: android listview android-listview asp.net-web-api android-scrollview


    【解决方案1】:

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

    
    @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    
                if(((firstVisibleItem + visibleItemCount) == totalItemCount) && (totalItemCount > 0)) {
                    loadNewData();
                }
            }
    

    【讨论】:

    • 我觉得我需要在这里发表评论,不要破坏这个答案,而是警告人们使用 onScroll 的不利之处。我一直在测试它,因为我需要一种动态加载数据的机制,我注意到的一件事是,如果用户将列表扔得太快,代码可能永远不会运行。这当然是个问题。就我而言,即使用户一扔,我也需要能够动态加载列表。如果您只想在列表的结尾或开头之后加载,那么这个答案就可以了。但是如果他们走这条路,想为他们节省一些时间,这个限制会导致问题:)
    【解决方案2】:

    适配器的getView() 将在项目可见时被调用。 所以你可以在getView(14, convertView, parent)时开始获取并显示下一个15。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        有一个使用图像延迟加载的教程。你应该检查一下

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

        这是来自 GitHub 的惰性列表视图的一些演示。

        https://github.com/thest1/LazyList

        希望能帮到你!!

        [感谢代码和教程的原作者]

        【讨论】:

        • 这是不同的。该示例显示了如何使用预定义的元素“惰性”加载图像。 Jeeva 询问如何将元素动态添加到列表底部。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多