11

我有一个显示图像和文本的列表视图。我想一次显示 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 个数据。这段代码有什么问题???

4

1 回答 1

12

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

更新:

请参阅此处的演示要点。

于 2013-01-26T09:52:08.207 回答