【问题标题】:How to load data from server to listview when scrolled?滚动时如何将数据从服务器加载到列表视图?
【发布时间】:2013-01-26 08:51:29
【问题描述】:

我有一个显示图像和文本的列表视图。我想一次显示 8 个列表视图行,从服务器下载数据。当用户滚动列表视图时,我需要下载更多数据表单服务器并在列表视图中显示项目。我使用 AsyncTask 从服务器下载数据。

@Override
    protected Void doInBackground(Void... params) {
        getData();// get data first time. 8 data items.
        return null;
    }

   @Override
   protected void onPostExecute(Void result) {

        super.onPostExecute(result);
        pd.dismiss();
        lv= (ListView) findViewById(R.id.lvn);
        yt = new YouTubeAdapter(Youtube.this,msg,title,thumb);
        lv.setAdapter(yt);
        lv.setOnScrollListener(new EndLessScroll());

    }

获取数据代码

   public void getData()
{
    HttpClient httpclient = new DefaultHttpClient();
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    HttpGet request = new HttpGet("http://gdata.youtube.com/feeds/api/users/mbbangalore/uploads?v=2&alt=jsonc");     
    try
    {
    HttpResponse response = httpclient.execute(request);
    HttpEntity resEntity = response.getEntity();
    String _response=EntityUtils.toString(resEntity); // content will be consume only once

    JSONObject json = new JSONObject(_response);

    jsonArray = json.getJSONObject("data").getJSONArray("items");
    for (int i = 0; i < 8; i++) {
        JSONObject jsonObject = jsonArray.getJSONObject(i);

        String title1 = jsonObject.getString("title");
        title.add(title1);
        String thumbUrl = jsonObject.getJSONObject("thumbnail").getString("sqDefault");
        URL url1 = new URL(thumbUrl);
        Bitmap bmp = BitmapFactory.decodeStream(url1.openConnection().getInputStream());
        thumb.add(bmp);
        String url;
        try {

            url = jsonObject.getJSONObject("player").getString("default");
            msg.add(url);
        } catch (JSONException ignore) {
        }
    }
    } 
    catch(Exception e1)
        {
            e1.printStackTrace();
        }

    httpclient.getConnectionManager().shutdown();
}

滚动时加载数据

  class EndLessScroll implements OnScrollListener {

    private int visibleThreshold = 5;
    private int currentPage = 0;
    private int previousTotal = 0;
    private boolean loading = true;

    public EndLessScroll() {
    }
    public EndLessScroll(int visibleThreshold) {
        this.visibleThreshold = visibleThreshold;
    }

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

         if (lv.getLastVisiblePosition() >= lv.getCount());
             {System.out.println("............................"+"first"+ firstVisibleItem+"visible"+visibleItemCount+"total"+ totalItemCount);
               for (int i= totalItemCount; i < jsonArray.length(); i++) {
                   try
                   {
                   JSONObject jsonObject = jsonArray.getJSONObject(i);
                   // The title of the video
                   String title1 = jsonObject.getString("title");
                   title.add(title1);
                   System.out.println("title"+title);
                   String thumbUrl = jsonObject.getJSONObject("thumbnail").getString("sqDefault");
                   URL url1 = new URL(thumbUrl);
                   Bitmap bmp = BitmapFactory.decodeStream(url1.openConnection().getInputStream());
                   thumb.add(bmp);
                   String url;
                    url = jsonObject.getJSONObject("player").getString("default");
                       msg.add(url);
                   } catch (JSONException ignore) {
                     //  url = jsonObject.getJSONObject("player").getString("default");
                   }
                   catch(Exception e)
                   {

                   }
                   yt.notifyDataSetChanged();
               }
         }
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }
}

现在的问题。我可以滚动显示 8 个列表视图行。假设服务器有 10000 个数据项。当用户向下滚动时,我需要一次在列表视图中显示 8 个项目下载其余项目。当用户向下滚动时,应该下载并显示新数据,直到用户能够看到第 10000 个数据。这段代码有什么问题???

【问题讨论】:

标签: android listview


【解决方案1】:

如果您不想使用滚动检测器,另一种方法是触发从适配器下载,当从getView() 请求最后一个项目时,运行任务并将更多项目附加到适配器的集合中。然后拨打notifyDataSetChanged()

更新:

参见演示要点here

【讨论】:

  • 此链接已失效。如果您有任何其他演示项目要分享,请更新
  • @Androidster 更新链接。
猜你喜欢
  • 2021-08-11
  • 1970-01-01
  • 2012-04-23
  • 2016-10-17
  • 1970-01-01
  • 2021-12-24
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多