Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.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 使用ListFragment和CursorLoader get时;ListFragment不能强制转换为;消息_Android_Android Fragments_Android Fragmentactivity - Fatal编程技术网

Android 使用ListFragment和CursorLoader get时;ListFragment不能强制转换为;消息

Android 使用ListFragment和CursorLoader get时;ListFragment不能强制转换为;消息,android,android-fragments,android-fragmentactivity,Android,Android Fragments,Android Fragmentactivity,有人能给我举一个使用游标装入器查询SQLite数据库并填充ListFragment的简单示例吗?下面的代码将进行编译,但当我运行它时,LogCat告诉我“ListFrag”不能强制转换为LoaderManager.LoaderCallbacks。如果我更改ListFrag,使其不是ListFrag,只是ListFrag,我会被告知“ListFrag不能转换为android.v4.support.Fragment”。请注意,由于中的信息,我的活动扩展了FragmentActivity,我的片段扩展

有人能给我举一个使用游标装入器查询SQLite数据库并填充ListFragment的简单示例吗?下面的代码将进行编译,但当我运行它时,LogCat告诉我“ListFrag”不能强制转换为LoaderManager.LoaderCallbacks。如果我更改ListFrag,使其不是ListFrag,只是ListFrag,我会被告知“ListFrag不能转换为android.v4.support.Fragment”。请注意,由于中的信息,我的活动扩展了FragmentActivity,我的片段扩展了ListFragment。我已经挣扎了一段时间了,我就是不明白。以下是包含片段的活动的代码,谢谢:

import android.os.Bundle;
import android.support.v4.app.FragmentActivity

public class MyList extends FragmentActivity {
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.myfragment);
}
}
这是我的片段代码:

import android.app.ListFragment;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v4.app.LoaderManager;
import android.view.View;
import android.widget.ListView;

@SuppressWarnings("hiding")
public class ListFrag<Cursor> extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {   
    private static final String TABLE_BASEPATH = "MyTable_tbl";
    private static final String AUTHORITY = "SQLData";
    public static final Uri MY_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_BASEPATH);
    private static final String[] PROJECTION = new String[] { "_id", "fieldname" };
    private SimpleCursorAdapter mAdapter;
    private static final int LOADER_ID = 0;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @SuppressWarnings("unchecked")
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Intent myData = getActivity().getIntent();
        Bundle info = myData.getExtras();


            SimpleCursorAdapter adapter;
            String[] dataColumns = { "fieldname" };
            int[] viewIDs = { R.id.mydetails };
            adapter = new SimpleCursorAdapter(getActivity(), R.layout.mylist, null, dataColumns, viewIDs, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
            setListAdapter(adapter);
            getLoaderManager().initLoader(0, info, (LoaderCallbacks<Cursor>) this); 

    }

          @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        String item = (String) getListAdapter().getItem(position);
        DetailFrag frag = (DetailFrag) getFragmentManager().findFragmentById(R.id.frag_detail);
        if (frag != null && frag.isInLayout()) {
            frag.setText(item);
        }
    }

    @SuppressWarnings("unchecked")
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        String selection = "level='" + args.getString("Level") + "'";
        return (Loader<Cursor>) new CursorLoader(getActivity(), MY_URI,
                PROJECTION, selection, null, null); 
    }
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        switch (loader.getId()) {
          case LOADER_ID:
            mAdapter.swapCursor((android.database.Cursor) cursor);
            break;
        }


    }
    public void onLoaderReset(Loader<Cursor> loader) {
        mAdapter.swapCursor(null);

    }

}

首先尝试将这些导入切换到支持库版本。更改:

import android.app.ListFragment;
import android.app.LoaderManager.LoaderCallbacks;
致:

接下来,请确保您正在请求支持片段管理器:

DetailFrag frag = (DetailFrag) getActivity().getSupportFragmentManager().findFragmentById(R.id.frag_detail);
//                                              ^^^^^^^
(如果您仍然需要帮助发布这些更改导致的LogCat错误,那么这可能无法解决所有问题,以便我们能够准确地看到发生了什么。)


添加
mAdapter
null
,将
adapter
更改为
mAdapter

mAdapter = new SimpleCursorAdapter(getActivity(), R.layout.mylist, null, dataColumns, viewIDs, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
您应该检查一下,它们提供不同版本的加载程序来处理片段。你只需要下载他们的软件包,在里面你可以找到工作的样品


Ups,我刚看到这是七个月大的。希望它仍然有用。

感谢您的快速响应!我对您建议的导入做了两个更改,但是将getFragmentManager更改为getSupportFragmentManager将无法编译。错误是,“类型ListFrag的getSupportFragmentManager()未定义”。把我的类名改成ListFrag也没用。因此,当两个导入指向支持库并调用getFragmentManager时,我将在下一个评论中发布我的LogCat使用“编辑”将LogCat添加到您的问题中(在左下角),评论格式不好…好的,我无法发布我的整个LogCat;太长,但有以下行:11-05 15:47:32.843:E/ActivityThread(553):未能找到SQLData的提供程序信息。这给了我们线索吗?SQLData是我定义SQLite数据库的类。或者,我可以发布我的整个日志作为问题的答案,但我不确定这是允许的。请指教,谢谢!好的,我在第一个问题中加入了LogCat。我注意到您在
onCreate()
中意外使用了
SimpleCursorAdapter
而不是
mAdapter
,我的新答案显示了要更改的内容。下一步是什么?:)本教程:对ListFragments与CursorAdapters的结合做一个很好的概述。因为某种原因,我从来没有收到一封电子邮件通知我你的答案。我今天才注意到。我会看看夏洛克,如果有帮助的话,我会投你一票。谢谢!;)。如果你喜欢Ruby,你也应该检查Ruboto。可能有助于数据库管理。
DetailFrag frag = (DetailFrag) getActivity().getSupportFragmentManager().findFragmentById(R.id.frag_detail);
//                                              ^^^^^^^
mAdapter = new SimpleCursorAdapter(getActivity(), R.layout.mylist, null, dataColumns, viewIDs, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);