Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android ListView的无限适配器_Android_Listview_Ion - Fatal编程技术网

android ListView的无限适配器

android ListView的无限适配器,android,listview,ion,Android,Listview,Ion,我使用库从服务器接收数据。我有一个问题,我的代码多次发出get请求,所以我的列表中有重复数据。 我的适配器代码: 公共类ArticleAdapter扩展了ArrayAdapter{ 前一次的未来装载; 静态类文章持有者{ 图像视图; 文本视图标题; } @凌驾 公共视图getView(int位置、视图转换视图、视图组父视图){ 物品持有人; if(convertView==null){ convertView=LayoutFlater.充气(R.layout.list\u view\u项,空);

我使用库从服务器接收数据。我有一个问题,我的代码多次发出get请求,所以我的列表中有重复数据。 我的适配器代码:

公共类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