Listview在实现加载更多功能时工作不正常

时间:2013-07-29 00:01:27

标签: android listview notifydatasetchanged

因此,我有一个listview并从外部数据库获取数据。我希望第一次有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个,但我无法点击任何项目。但是,例如,如果我更改活动并返回列表视图,它可以工作。为什么? 谢谢!

1 个答案:

答案 0 :(得分: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

            } 
        }
    });
}