ArrayAdapter中的android LazyList缓存问题

ArrayAdapter中的android LazyList缓存问题,android,android-arrayadapter,android-loadermanager,lazylist,Android,Android Arrayadapter,Android Loadermanager,Lazylist,在我的应用程序中,我有一个项目列表,我通过LoaderManager获取项目。当我选择或取消选择项目时,它不能正常工作,我的意思是有时不能选择所有项目。也许它会在onLoadFinished方法中将缓存的值返回给适配器。有人有想法吗 @EFragment(R.layout.fragment_mailbox) public class MyFragment extends ListFragment implements SearchView.OnQueryTextListener, Loa

在我的应用程序中,我有一个项目列表,我通过LoaderManager获取项目。当我选择或取消选择项目时,它不能正常工作,我的意思是有时不能选择所有项目。也许它会在onLoadFinished方法中将缓存的值返回给适配器。有人有想法吗

@EFragment(R.layout.fragment_mailbox)
public class MyFragment extends ListFragment implements SearchView.OnQueryTextListener,
    LoaderManager.LoaderCallbacks<LazyList<Item>> {


@AfterViews
public void afterViews() {
    broadcastReceiver = new MailboxEmailBroadcastReceiver(this);

    setEmptyText(getString(R.string.fragment_mailbox_list_empty));

    adapter = new ItemListAdapter(getActivity(), mailAccountIdExtra, folderIdExtra);

    setListAdapter(adapter);
    setListShown(false);

    getLoaderManager().initLoader(1, null, this);        
}

@Override
public Loader<LazyList<Item>> onCreateLoader(int id, Bundle bundle) {
    ...
}

@Override
public void onLoadFinished(Loader<LazyList<Item>> listLoader, LazyList<Item> items) {
    adapter.swapList(items);
    adapter.notifyDataSetChanged();
    hideLoader();
    if (isResumed()) {
        setListShown(true);
    } else {
        setListShownNoAnimation(true);
    }
}    

private void selectOrDeselectItems(MenuItem item) {
    adapter.selectAllItems((isSelectAllToggle) ? false : true);        
}
@EFragment(R.layout.fragment\u邮箱)
公共类MyFragment扩展ListFragment实现SearchView.OnQueryTextListener,
LoaderManager.LoaderCallbacks{
@后景
公众意见{
broadcastReceiver=新的MailboxEmailBroadcastReceiver(此);
setEmptyText(getString(R.string.fragment_mailbox_list_empty));
adapter=newitemlistadapter(getActivity(),mailAccountIdExtra,folderIdExtra);
setListAdapter(适配器);
SetListShowed(假);
getLoaderManager().initLoader(1,null,this);
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle){
...
}
@凌驾
public void onLoadFinished(装入器列表装入器、懒散列表项){
适配器、交换列表(项目);
adapter.notifyDataSetChanged();
hideLoader();
如果(isResumed()){
SetListShowed(真);
}否则{
SetListShownAnimation(真);
}
}    
专用无效选择器或选定项(菜单项){
adapter.selectAllItems((isSelectAllToggle)?false:true;
}
}

这是我的适配器

public class ItemListAdapter extends BaseAdapter {

@Override
public View getView(int i, View convertView, ViewGroup parent) {

    ViewHolder viewHolder;

    final Item item = items.get(i);        

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.layout, parent, false);
        viewHolder = new ViewHolder();            
        viewHolder.lineView       = (ImageView) convertView.findViewById(R.id.line_view);            
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    if(item.isChecked()) {
        viewHolder.lineView.setVisibility(View.VISIBLE);
    } else
        viewHolder.lineView.setVisibility(View.INVISIBLE);

    return convertView;
}


public void swapList(List<Item> items) {
    this.items = items;
}

public List<Item> getList () {
    return items;
}   

public void selectAllItems(boolean isSelectAll) {      
    for (Item item: items) {
        item.setChecked(isSelectAll);            
    }
}


static class ViewHolder {        
    ImageView lineView;
}
公共类ItemListAdapter扩展了BaseAdapter{
@凌驾
公共视图getView(int i、视图转换视图、视图组父视图){
持票人持票人;
最终项目=项目。获取(i);
if(convertView==null){
convertView=充气机。充气(R.layout.layout,父级,false);
viewHolder=新的viewHolder();
viewHolder.lineView=(ImageView)convertView.findViewById(R.id.line\u视图);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
如果(item.isChecked()){
viewHolder.lineView.setVisibility(View.VISIBLE);
}否则
viewHolder.lineView.setVisibility(视图.不可见);
返回视图;
}
公共无效交换列表(列表项){
这个项目=项目;
}
公共列表getList(){
退货项目;
}   
public void selectAllItems(布尔值为selectAll){
用于(项目:项目){
项目设置已选中(isSelectAll);
}
}
静态类视图持有者{
图像视图线视图;
}

}

在更新项目后调用notifyDataSetChanged以刷新视图:

public void selectAllItems(boolean isSelectAll) {      
    for (Item item: items) {
        item.setChecked(isSelectAll);            
    }
    notifyDataSetChanged();
}

我已经在onLoadFinished()方法中写过了。onLoadFinished方法正在监视对象何时更改。是的,您可以在任何位置执行此操作,但我建议在适配器中执行此操作。在任何更新数据的方法结束时,都可以避免bug。