首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现列表视图的OnScrollListener??

如何实现列表视图的OnScrollListener??
EN

Stack Overflow用户
提问于 2015-02-26 19:47:36
回答 3查看 18.9K关注 0票数 5

我从服务器获得500条记录。我想在列表视图中显示10个项目,当列表视图到达末尾时,我需要加载另外10个项目,以此类推。我在网上看过很多例子,但是我无法解决这个问题,请帮帮我。

下面是我的代码:

代码语言:javascript
复制
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.form);
    Seen = (ImageView) findViewById(R.id.SeenStatus);       


    new GetDescendingDate().execute();
    userArray = new ArrayList<listmodel>();

    ListView lv = getListView();


    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting values from selected ListItem
            String Id = ((TextView) view.findViewById(R.id.txtId))
                    .getText().toString();

            // Starting single activity
            Intent in = new Intent(getApplicationContext(),
                    details.class);
            in.putExtra("TAG_Id", Id);
            startActivity(in);


    });



    }

}


private class GetDescendingDate extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Showing progress dialog
        pDialog = new ProgressDialog(Atab.this);
        pDialog.setMessage("Loading...");
        pDialog.setCancelable(false);
        pDialog.show();

    }

    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    @Override
    protected Void doInBackground(Void... arg0) {

        JSONParser jParser = new JSONParser();

        // Getting JSON Array node
        JSONArray json;

        session = new SessionManager(getApplicationContext());
        session.checkLogin();
        HashMap<String, String> user = session.getUserDetails();
        String email = user.get(SessionManager.KEY_EMAIL);
        String Status = "New";
        String get;
        get = URL.Get;
        String url_new = get + email + "/" + Status + "/" + "SODD"
                + "/" + "null" + "/" + "0" + "/" + "10";
        try {
            json = jParser.getJSONFromUrl(url_new);

            if (json != null) {
                // looping through All Orders
                for (int i = 0; i < json.length(); i++) {
                    try {
                        JSONObject c = json.getJSONObject(i);

                        String number = c.getString("No");
                        String By = c.getString("By");
                        String Type = c.getString("Type");
                        String Descripton = c.getString("Desc");
                        String Date = c.getString("DateTime");
                        String Id = c.getString("Id");
                        String ONo = c.getString("ONo");
                        String FirstName = c        .getString("FirstName");
                        String Price = c.getString("Price");


                        listmodel list = new listmodel();
                        list.setId(Id);
                        list.setBy(By);
                        list.setType(Type);
                        list.setDescription(Descripton);
                        list.setDate(Date);
                        list.setPrice(Price);
                        list.setName(FirstName);

                        userArray.add(list);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }

            else {
                Log.e("New", "Couldn't get any data from the url");

            }
        } catch (JSONException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        return null;
    }

    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        if (pDialog.isShowing())
            pDialog.dismiss();

        adapter = new adapter(Atab.this,userArray);         
        setListAdapter(adapter);


    }

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-26 20:27:17

你可以像这样实现..

代码语言:javascript
复制
 listView.setOnScrollListener(new OnScrollListener() {
        private int currentVisibleItemCount;
        private int currentScrollState;
        private int currentFirstVisibleItem;
        private int totalItem;
        private LinearLayout lBelow;


        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            // TODO Auto-generated method stub
            this.currentScrollState = scrollState;
            this.isScrollCompleted();               
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            // TODO Auto-generated method stub
            this.currentFirstVisibleItem = firstVisibleItem;
            this.currentVisibleItemCount = visibleItemCount;
            this.totalItem = totalItemCount;


        }

        private void isScrollCompleted() {
            if (totalItem - currentFirstVisibleItem == currentVisibleItemCount
                    && this.currentScrollState == SCROLL_STATE_IDLE) {
             /** To do code here*/


        }
    });
票数 16
EN

Stack Overflow用户

发布于 2015-02-26 20:21:44

最简单的选择

首先,您需要添加列表脚注并分配OnScrollListener

代码语言:javascript
复制
ProgressBar footer = new ProgressBar(this);
listView.addFooterView(footer);
listView.setOnScrollListener(scrollListener);

而这个实现OnScrollListener

代码语言:javascript
复制
private AbsListView.OnScrollListener scrollListener = new AbsListView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            int lastInScreen = firstVisibleItem + visibleItemCount;
            if(lastInScreen == totalItemCount && !isLoading){
                loadMoreItems(totalItemCount - 1);
                isLoading = true;
            }
        }
    };

服务器给了我10个元素的记录

下载完成后,isLoading会更改

totalItemCount - 1 start position(footer也是列表中的一个元素)

完成后,您需要向适配器adapter.addAll(list);添加新元素,并执行adapter.notifyDataSetChanged ();并将isLoading = false;

票数 3
EN

Stack Overflow用户

发布于 2015-02-26 20:37:22

如下所示:

代码语言:javascript
复制
public OnScrollListener scrollListener = new OnScrollListener() 
{
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
    { 
         if((firstVisibleItem + visibleItemCount) >= totalItemCount) && /*also maybe some condition else*/) 
         {    

             //here start next 10 items request                   
         }


    @Override
    public void onScrollStateChanged(AbsListView arg0, int arg1) {
            // TODO Auto-generated method stub

    }

};

如果您的服务器在每次休息时都像nextUrl一样给出下10个条目请求URL,那么您可以检查nextUrl是否为null,如果null意味着没有更多的条目可用,那么您可以检查condition else中是否没有。

最后,记住将listener设置为您的ListView

代码语言:javascript
复制
yourListView.setOnScrollListener(scrollListener);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28741645

复制
相关文章

相似问题

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