首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在onScroll ListView (Android)中启动onScroll方法

如何在onScroll ListView (Android)中启动onScroll方法
EN

Stack Overflow用户
提问于 2014-03-04 16:17:57
回答 2查看 386关注 0票数 0

首先,我从服务器获得数据,然后构建了ListView,现在我不想在列表视图滚动到底部时加载更多。我的异步类有名称Fetch,所以我认为需要调用吗?另外,我还需要使用我第一次调用的Fetch对象礼仪的所有值,

感谢大家!

我这里的活动代码

代码语言:javascript
复制
public class InboxActivity extends Activity implements View.OnClickListener {


    ......................


    DatePickerDialog.OnDateSetListener d = new DatePickerDialog.OnDateSetListener() {

        ........

        public void onDateSet(DatePicker view, int year, int monthOfYear,
                int dayOfMonth) {
        ...........     

            this.fetch = new FetchTask();
            this.fetch.Selectedmonth = this.Smonth;
            this.fetch.Selectedyear = this.Syear;
            this.fetch.page = 0;
            this.fetch.sess_id = user_id;
            ListView ll = (ListView)findViewById(R.id.mailList);
            this.fetch.ll = ll;
            this.fetch.execute();
            ll.setOnScrollListener(new OnScrollListener(){


                public void onScrollStateChanged(ListView view, int scrollState)
                {



                }

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




                    if(firstVisibleItem+visibleItemCount==totalItemCount)
                    {

                    HERE I NEED TO LAUNCH FETCH object  

                    }                       

                }



        }
    };






public class FetchTask extends AsyncTask<Void, Void, JSONArray> {

    HERE MY PRORPITIES

        @Override

        protected JSONArray doInBackground(Void... params) {
            try {

                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("my url");

                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);


                nameValuePairs.add(new BasicNameValuePair("qw", "er"));
                nameValuePairs.add(new BasicNameValuePair("debug", "1"));
                nameValuePairs.add(new BasicNameValuePair("t", "0"));
                nameValuePairs.add(new BasicNameValuePair("m", Integer.toString(this.Selectedmonth)));
                nameValuePairs.add(new BasicNameValuePair("y", Integer.toString(this.Selectedyear)));
                nameValuePairs.add(new BasicNameValuePair("st", Integer.toString(this.page)));
                nameValuePairs.add(new BasicNameValuePair("sess_id", this.sess_id));


                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));


                HttpResponse response = httpclient.execute(httppost);

                BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "utf-8"), 8);
                StringBuilder sb = new StringBuilder();
                sb.append(reader.readLine());
                String line = "0";
                while ((line = reader.readLine()) != null) 
                {
                    sb.append(line);
                }
                reader.close();
                String result11 = sb.toString();
                System.out.println(result11);
                this.result_str = result11;
                // parsing data
                JSONArray arr = new JSONArray(result11);





                return new JSONArray(result11);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }



          @Override
          protected void onPreExecute() {
              this.pd = new ProgressDialog(InboxActivity.this);
              this.pd.setMessage("loading");
              this.pd.show();         
          } 


        @Override
        protected void onPostExecute(JSONArray result)
        {

            if (result != null) 
            {
                List<String> subjects = new ArrayList<String>();
                List<String> emails = new ArrayList<String>();

                for(int i = 0; i < result.length(); i++)
                {
                    try 
                    {
                        JSONObject json_data = result.getJSONObject(i);
                        emails.add(json_data.getString("mittente"));
                        subjects.add(json_data.getString("oggetto"));
                    } 
                    catch (JSONException e) 
                    {
                        e.printStackTrace();
                    }

                }
                if(this.page == 0)
                {
                    this.adapter = new ArrayAdapter<String>(
                            InboxActivity.this,
                            R.layout.da_item,
                            emails
                        );
                    this.ll.setAdapter(this.adapter);               
                }
                else
                {
                    for(int i = 0; i < result.length(); i++)
                    { 
                        JSONObject json_data;
                        try 
                        {
                            json_data = result.getJSONObject(i);
                            this.adapter.add(json_data.getString("mittente"));  
                        } 
                        catch (JSONException e) 
                        {
                            e.printStackTrace();
                        }

                    }
                }
            } 
            else 
            {
                System.out.println("Messages not found");

            }    
            this.pd.dismiss();
        }
    }   
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-04 16:35:13

概括概述:

  1. 您需要重新创建一个新的fetch对象。您不能重新执行旧的AsynTask。
  2. 一个问题是,您不知道列表视图中有多少元素,因此滚动条将显示为它到达末尾的样子。您的获取可能会及时返回,并且添加更多的元素,并且神奇地有更多的内容要滚动,或者它没有及时返回,并且用户到达了明显的终端。如果可以提前确定总数,请重写GetCount方法。
  3. 决定何时获取下一个数据集。如果覆盖适配器的getView方法,则在适配器为每个位置创建视图时,将能够获得回调。当用户滚动时,该位置将越来越接近您的数组的末尾。设置一些阈值以开始获取下一个数据集。 类myAdapter扩展ArrayAdapter{ @重写公共视图getView(int位置,视图convertView,ViewGroup父){返回super.getView(位置,convertView,父);if(!thresholdReachedBefore & position & position >阈值){ fetchNextDataSet();} }
票数 0
EN

Stack Overflow用户

发布于 2014-03-04 16:43:54

要运行AsyncTask,必须调用扩展AsyncTask的类的execute()方法。但是,每次进行抓取时都要小心,因为您将获取一组新的原始数据,这些数据可能会导致重复。解决这一问题的一种方法是只返回一定数量的元素并对其进行计数。下次进行提取时,只从下一个索引中提取元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22177266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档