Android 旋转碎片中的endlessadapter最佳实践是什么?
因此,我在一个片段上使用Commonware中的endlessadapter,我遇到的问题是,每当我在适配器等待完成加载某些数据时旋转,就会再次调用cacheInBackground方法。适配器的初始化是在片段中的onActivityCreated方法上调用的,那么我如何简单地恢复第一次调用cacheInBackground方法的结果呢Android 旋转碎片中的endlessadapter最佳实践是什么?,android,android-fragments,rotation,commonsware-cwac,Android,Android Fragments,Rotation,Commonsware Cwac,因此,我在一个片段上使用Commonware中的endlessadapter,我遇到的问题是,每当我在适配器等待完成加载某些数据时旋转,就会再次调用cacheInBackground方法。适配器的初始化是在片段中的onActivityCreated方法上调用的,那么我如何简单地恢复第一次调用cacheInBackground方法的结果呢 IpdmsEndlessAdapter endAdapt= new IpdmsEndlessAdapter(getActivity(),adapter,R.la
IpdmsEndlessAdapter endAdapt= new IpdmsEndlessAdapter(getActivity(),adapter,R.layout.list_loading_row){
@Override
protected boolean cacheInBackground() throws RequestException{
tempList.clear();
List<MyProcessDTO> myPRocs;
myPRocs = new MyprocessesManager(getActivity()).getMyProcessesFromServer(processListPage);
if(myPRocs!=null){
tempList.addAll(myPRocs);
}else
return false;
//return true if there's more data do return
//return false if there was an error or there's no more data
return myPRocs.size()>=10;
}
@Override
protected boolean onException(View pendingView, Exception e) {
Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show();
return false;
}
@Override
protected void appendCachedData() {
@SuppressWarnings("unchecked")
GenericMenuAdapter a=(GenericMenuAdapter)getWrappedAdapter();
for(MyProcessDTO myProcessDTO:tempList){
a.add(new IpdmsMobileMenuItemListDTO(myProcessDTO.getNrprocesso(), myProcessDTO.getEtapa(), 0, myProcessDTO));
}
processListPage++;
}
};
actualListView.setAdapter(endAdapt);
IpdmsEndlessAdapter endAdapt=新的IpdmsEndlessAdapter(getActivity(),适配器,R.layout.list_loading_行){
@凌驾
受保护的布尔cacheInBackground()引发RequestException{
圣殿骑士;
列出myproc;
myPRocs=新建MyProcessManager(getActivity()).GetMyProcessFromServer(processListPage);
如果(myPRocs!=null){
圣堂武士。addAll(myPRocs);
}否则
返回false;
//如果有更多数据需要返回,则返回true
//如果出现错误或没有更多数据,则返回false
返回myPRocs.size()>=10;
}
@凌驾
受保护的布尔onException(视图挂起视图,异常e){
Toast.makeText(getActivity(),e.getMessage(),Toast.LENGTH_SHORT).show();
返回false;
}
@凌驾
受保护的无效appendCachedData(){
@抑制警告(“未选中”)
GenericMenuAdapter a=(GenericMenuAdapter)getWrappedAdapter();
for(MyProcessDTO MyProcessDTO:templast){
a、 添加(新的IPDMSMobilementUItemListDTO(myProcessDTO.getnProcessO(),myProcessDTO.getEtapa(),0,myProcessDTO));
}
processListPage++;
}
};
actualListView.setAdapter(endAdapt);
关于,将其设置为动态片段(即,通过
片段事务设置它),并在设置过程中的某个地方调用setRetainInstance(true)
(例如,onActivityCreated()
)。这将在配置更改之间保持适配器实例
在后台线程执行其工作时,配置更改可能仍然存在一些问题。如果您在应用上述建议后仍遇到问题,请对此答案发表评论。您好!做记号我现在用一个viewpager调用这个片段,我只是按照你说的做了,我把片段的onActivityCreated方法的setRetainInstance设置为true,似乎如果我在片段仍在加载时旋转,就会调用一个新任务(来自cacheInBackground方法)。有没有办法防止这种情况发生?使用setRetainInstance处理片段上的线程/异步任务是否是一种良好的做法,或者在旋转时维护片段是否有缺点?@Maxrunner:我必须运行一些实验来确定最佳策略。这可能需要几天时间。我已经打开了一个GitHub问题来跟踪它:@Maxrunner:也就是说,AsyncTask
和保留的片段配合得很好。忘了问一下,如果我将setRetainInstance设置为true,哪些片段生命周期方法被忽略了??我知道onCreate不会被调用,但是onCreateView和onSaveInstanceState呢?它们被调用了吗?@Maxrunner:onCreateView()
仍然被调用。我不知道是否调用了onSaveInstanceState()
——您必须检查文档或运行测试。