因此,我有一个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个,但我无法点击任何项目。但是,例如,如果我更改活动并返回列表视图,它可以工作。为什么?
谢谢!
答案 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
}
}
});
}