如何在ListView中实现OnScrollListener?

5
我将从服务器获取500条记录..我希望在一个列表视图中显示10个项目,当列表视图到达末尾时,我需要加载另外10个,以此类推.. 我在网上看到了很多例子,但是我无法解决它 请帮助我。
这是我的代码:
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);


    }

}

你可能会发现这个链接有用:http://developer.android.com/guide/topics/ui/layout/listview.html - “ListView是一个视图组,它显示可滚动项目列表。 列表项是自动插入到列表中的,使用从源(例如数组或数据库查询)提取内容并将每个结果转换为放置在列表中的视图的适配器。” - ITJscott
你需要在服务器端进行维护。例如,如果你在 API 调用中传递了 0 位置,你将获得 10 条记录,而对于下一个 1,你将获得接下来的 10 条记录,以此类推... 这意味着你每次只能从服务器获取 10 条记录... - Ram
3个回答

16

你可以像这样实现...

 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*/


        }
    });

谢谢,它帮了我很多 :) - kiran guled

3
最简单的方法
首先,您需要添加列表页脚并分配OnScrollListener。
ProgressBar footer = new ProgressBar(this);
listView.addFooterView(footer);
listView.setOnScrollListener(scrollListener);

而这个认知 OnScrollListener

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 是起始位置(页脚也是列表的一个元素)。

下载完成后,您需要将新元素添加到适配器中 adapter.addAll(list); 并调用 adapter.notifyDataSetChanged();,然后设置 isLoading = false;


谢谢您的回复,我从上面的代码中学到了如何添加页脚,在更新时列表看起来非常好 :) - kiran guled

1

它如下:

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

    }

};

如果您的服务器在每个响应中提供下一个10项请求URL,例如nextUrl,则可以在else条件中检查nextUrl是否为null,如果为null,则表示没有更多的项可用。
最后,请记得为您的ListView设置监听器。
yourListView.setOnScrollListener(scrollListener);

@kiran guled 你解决了你的问题吗?如果还有其他问题,请告诉我。 - Xcihnegn
谢谢您的回复,它对我很有帮助 :) - kiran guled

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接