Android LoaderManager.LoaderCallbacks<;光标>;适配器.swapCursor(数据)

Android LoaderManager.LoaderCallbacks<;光标>;适配器.swapCursor(数据),android,android-cursoradapter,android-loadermanager,Android,Android Cursoradapter,Android Loadermanager,我有一个ListView片段,它实现了LoaderManager.LoaderCallbacks 有时单击列表项不会触发侦听器。我看到点击的项目突出显示,但没有更多。当onLoadFinished和onItemClick同时执行时会发生这种情况。 代码如下: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View

我有一个ListView片段,它实现了LoaderManager.LoaderCallbacks 有时单击列表项不会触发侦听器。我看到点击的项目突出显示,但没有更多。当onLoadFinished和onItemClick同时执行时会发生这种情况。 代码如下:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.folder_list_fragment, container, false);
    listView = (ListView) view.findViewById(R.id.listView);
    listView.setOnItemClickListener(new ListViewOnItemClickListener());
}

private final class ListViewOnItemClickListener implements OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            System.out.println("on click");
            //load new data from the database and execute update asynch
        }
    }

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    listView.setAdapter(adapter);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    adapter.swapCursor(data);
    System.out.println("swapCursor");
}
@覆盖
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.folder\u list\u片段,容器,false);
listView=(listView)view.findViewById(R.id.listView);
setOnItemClickListener(新的ListViewOnItemClickListener());
}
私有最终类ListViewOnItemClickListener实现OnItemClickListener{
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
System.out.println(“点击”);
//从数据库加载新数据并执行更新异步
}
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
setAdapter(适配器);
}
@凌驾
public void onLoadFinished(加载器、光标数据){
适配器。swapCursor(数据);
System.out.println(“swapCursor”);
}
日志为:

swapCursor-首次初始化

点击-点击项目
swapCursor-更新数据
swapCursor-更新数据

单击-单击项目 swapCursor-更新数据

单击项目,参见背景突出显示,如正常单击
swapCursor-问题是,我点击了一个项目,但是之前更新的通知已经放弃了onClick,没有任何关于点击日志的打印


单击-下次单击时,我终于找到了问题所在

项目有一个包含一些信息的数据库,索引列的名称为“id”

根据本教程

投影只是要与适配器一起使用的列的列表。这个 ListView使用标题,并可以在创建项目时提供id 点击。要与适配器一起使用,id列必须命名为“\u id”

在解决列名问题之前,实施此投影:

public static final String[] DEFAULT_PROJECTION = new String[] {"id _id", FolderProvider.FOLDER_COLUMN_ID,
            FolderProvider.FOLDER_COLUMN_NAME}; 
所以ContentProvider和CursorAdapter工作正常,但有一段时间onItemClick()被丢弃

将“id”重命名为“\u id”可以解决此问题

下面是优秀的LoaderManager.LoaderCallbacks教程