android ListView的无限适配器
我使用库从服务器接收数据。我有一个问题,我的代码多次发出get请求,所以我的列表中有重复数据。 我的适配器代码:android ListView的无限适配器,android,listview,ion,Android,Listview,Ion,我使用库从服务器接收数据。我有一个问题,我的代码多次发出get请求,所以我的列表中有重复数据。 我的适配器代码: 公共类ArticleAdapter扩展了ArrayAdapter{ 前一次的未来装载; 静态类文章持有者{ 图像视图; 文本视图标题; } @凌驾 公共视图getView(int位置、视图转换视图、视图组父视图){ 物品持有人; if(convertView==null){ convertView=LayoutFlater.充气(R.layout.list\u view\u项,空);
公共类ArticleAdapter扩展了ArrayAdapter{
前一次的未来装载;
静态类文章持有者{
图像视图;
文本视图标题;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
物品持有人;
if(convertView==null){
convertView=LayoutFlater.充气(R.layout.list\u view\u项,空);
holder=新的ArticleHolder();
holder.articleImage=(ImageView)convertView.findViewById(R.id.articleImage);
holder.articleCaption=(TextView)convertView.findViewById(R.id.articleCaption);
convertView.setTag(支架);
}否则{
holder=(ArticleHolder)convertView.getTag();
}
Article=getItem(位置);
holder.articleCaption.setText(article.getTitle());
带(支架.图片)
.placeholder(R.drawable.placeholder)
.错误(R.drawable.default\u article\u image)
//.crossfade(真)
.load(article.getImageUrl());
//我们已接近列表适配器的末尾,请加载更多项
如果(位置>=getCount()-3){
loadPrevious(getItem(getCount()-1).getId());
}
返回视图;
}
私有void loadPrevious(长id){
//如果加载已在进行,则不要尝试加载更多
if(loadingOfPrevious!=null&&!loadingOfPrevious.isDone()&&!loadingOfPrevious.isCancelled()){
返回;
}
字符串url=”http://example.com/rest-api/"
url=url+“?id=“+id;
url=url+“&count=“+30;
//此请求将URL作为JsonArray加载并调用
//完成时的回调。
最后一个字符串articleUrl=url;
LoadingFlatest=Ion.with(getContext())
.load(articleUrl)
.as(新类型令牌(){
})
.setCallback(新的FutureCallback(){
@凌驾
未完成公共作废(例外e,列表结果){
//这会回调到ui线程,不需要Activity.runOnUiThread或Handler.post。
如果(e!=null){
Toast.makeText(getContext(),“Error.”,Toast.LENGTH_LONG.show();
返回;
}
//添加文章
如果(结果!=null){
收集。反向(结果);
对于(int i=0;i
}
我认为问题在于这一部分:
//我们快到列表适配器的末尾了,请加载更多项
如果(位置>=getCount()-3){
loadPrevious(getItem(getCount()-1).getId());
}
我这样做的方式是在ListView上使用OnScrollListener。当用户滚动并且firstVisibleItem+visibleItemCount
接近列表限制时,启动服务器数据加载
数据加载完成后,使用新数据更新列表适配器,并调用
onnotifydatasetchange()
。然后,列表将与您更新的数据一起重新显示。您说得对!这是因为这个密码
if (position >= getCount() - 3) {
loadPrevious(getItem(getCount() - 1).getId());
}
根据您的条件,“loadPrevious()”将被调用两次
“getView()”用于每次返回一个视图。因此,对于最后两项,您的条件为true,然后调用“loadPrevious()”两次。
所以,改变并像这样尝试
if (position >= getCount() - 2) {
loadPrevious(getItem(getCount() - 1).getId());
}
或
重新检查此代码
if (loadingOfPrevious != null && !loadingOfPrevious.isDone() && !loadingOfPrevious.isCancelled()) {
return;
}
顺便说一句,我想建议尝试其他方法,比如使用library,自定义listview