0

所以,我有一个列表视图并从外部数据库获取数据。我想第一次有 20 个项目,然后如果用户向下滚动它会加载另外 20 个,依此类推。

class ItemAdapter extends BaseAdapter {
        private ArrayList<Item> objects;
        private class ViewHolder {
             public TextView text_tt;  

        }

        @Override
        public int getCount() {
            return SIZE;
            //return 9;
        }

        @Override
        public Object getItem(int position) {
            return position;
        }

        @Override
        public long getItemId(int position) {
            return position;
        } 

@Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View v = convertView;
            final ViewHolder viewHolder;
            if (v == null) {
            LayoutInflater inflater = (LayoutInflater) getActivity().getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.list_item, null);
            viewHolder = new ViewHolder();
            viewHolder.text_tt = (TextView) v.findViewById(R.id.toptext);
            } else {
            viewHolder = (ViewHolder) convertView.getTag();
            }

            if(position==getCount()-1){
                LoadMore(); //asynctask - load other 20

            }
            return v;
        }
    }

在加载函数中,我解析了预读的 json 数据,所以我只需在列表中添加另外 20 个,然后notifyDataSetChanged().. 该函数运行良好,但它有一个副作用:大约 50% 的时间点击项目不是认可。我向下滚动,收到接下来的 20 个,但我无法单击任何项​​目。但例如,如果我更改活动并返回列表视图,它会起作用。为什么?谢谢!

4

1 回答 1

2

你可以OnScrollListener在你的ListView. 在onScroll()方法中,检查是否:

firstVisible + visibleItemCount = totalItemCount

如果满足此条件,您可以从数据库加载更多项目,使用更新的项目列表重新初始化适配器。

listView.setOnScrollListener(new OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {}

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

                // add 20 more items to the list and reinitialize the adapter

            } 
        }
    });
}
于 2013-07-29T00:52:05.607 回答