动态列表视图中可见列表项的数量

时间:2017-11-20 13:12:17

标签: android list listview

我正在初始化如下所示的列表视图并设置其自定义适配器

 lvRecords = (ListView) findViewById(R.id.lv_records);
 lvRecords.setAdapter(adapterSearchResult);

以下是我的适配器

public class SearchResultListAdapter extends ArrayAdapter implements View.OnClickListener{
        private Context context;
        private ArrayList<Record> records;
        private int numOfPaginatorBtns = 0;

        static class HolderView {
            public TextView tvBahiNum;
            public TextView tvRegNum;
            public TextView tvYear;
            public Button btnDetails;
            public Button btnRegistry;
        }

        @SuppressWarnings("unchecked")
        public SearchResultListAdapter(Context c, ArrayList<Record> records, int numOfPaginatorBtns) {
            super(c, R.layout.search_result_item, records);
            this.context = c;
            this.records = records;
            this.numOfPaginatorBtns = numOfPaginatorBtns;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Log.e("position", Integer.toString(position));
            if (convertView == null) {
                Log.e("in" , "convert View");
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.search_result_item, parent, false);

                HolderView listItem = new HolderView();
                listItem.tvBahiNum = (TextView) convertView.findViewById(R.id.tv_bahi_num);
                listItem.tvRegNum = (TextView) convertView.findViewById(R.id.tv_reg_num);
                listItem.tvYear = (TextView) convertView.findViewById(R.id.tv_year);
                listItem.btnDetails = (Button) convertView.findViewById(R.id.btn_details);
                listItem.btnDetails.setOnClickListener(this);

                convertView.setTag(listItem);`}`

            HolderView listItem = (HolderView) convertView.getTag();

            Record rec = records.get(position);

            listItem.tvRegNum.setText(rec.regNum);
            listItem.tvBahiNum.setText(rec.bahiNum);
            listItem.tvYear.setText(rec.year);
            return convertView;
        }

        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.btn_details:
                    break;
            }
        }
    }

我想查看我的列表View(lvRecords)的第一个视图调用了多少次getView。基本上我想跟踪可见列表项的数量。

有任何帮助吗?谢谢!

2 个答案:

答案 0 :(得分:2)

初始化列表并设置适配器后,您可以使用ListView的getLastVisiblePosition()getFirstVisiblePosition()方法查看可见的项目数。

注意:必须在屏幕上绘制ListView才能使这些方法起作用。如果你想在绘制列表之后得到计数,你可以尝试在视图本身上发布一个runnable,如下所示:

lvRecords.post(new Runnable() {
            @Override
            public void run() {
                int itemsShown = lvRecords.getLastVisiblePosition() - lvRecords.getFirstVisiblePosition(); 
            }
        });

如果您计划在每次用户滚动时计算项目数,则可以实现滚动侦听器:

    lvRecords.setOnScrollListener(new AbsListView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView absListView, int scrollState) {
            if(scrollState == SCROLL_STATE_IDLE) {
                int noOfItemsVisible = lvRecords.getLastVisiblePosition() - lvRecords.getFirstVisiblePosition();
                Log.e("no of items visible", String.valueOf(noOfItemsVisible));
            }
        }

        @Override
        public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            Log.e("no of items visible", String.valueOf(visibleItemCount));
        }
    });

每次状态更改(用户滚动,执行拖动或列表停止滚动)时都会调用onScrollStateChanged方法。

每次列表位置更改时都会调用onScroll方法,并且在滚动列表时将每秒调用多次,因此您应该避免在此处执行太多操作。

答案 1 :(得分:0)

您已记录该位置,请查看您有多少日志。

相关问题