【问题标题】:SwapCursor undefined when creating a CursorLoader创建 CursorLoader 时未定义 SwapCursor
【发布时间】:2013-03-30 22:38:07
【问题描述】:

我在创建 CursorLoader 时收到“swapCursor(Cursor) 未定义”错误。我已经导入了 android.support.v4(app.LoaderManager、app.LoaderManager.Loader、Content.CursorLoader、content.Loader)。不知道我能做些什么来纠正这个问题。请指教。

加载器:

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.app.ListFragment;
import android.support.v4.widget.CursorAdapter;



public class LoginList extends FragmentActivity implements OnClickListener, 
AdapterView.OnItemClickListener, LoaderManager.LoaderCallbacks<Cursor> {

    private ListView loginList;
    private Button webLogin;
    private SimpleCursorAdapter adapter;


    @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_listview);

        loginList = (ListView)findViewById(R.id.loginlist);
        loginList.setOnItemClickListener(this);

        webLogin = (Button)findViewById(R.id.button3);
        webLogin.setOnClickListener(this);



        //Specify fileds to display in the list
        String[] from = new String[] { ListProvider.COLUMN_NAME_SITE };

        //Bind fields to listview
        int[] to = new int[] {R.id.loginlist};

        // Create CursorAdapter and set it to display
        adapter = new SimpleCursorAdapter(this, R.layout.login_listview, null, from, to);

        loginList.setAdapter(adapter);

        getSupportLoaderManager().initLoader(0, null, this);
    }

    /*@Override
    public void onViewCreated(View view, Bundle savedInstanceState) {

    super.onViewCreated(view, savedInstanceState);
    setEmptyText(getResources().getString(string.app_name));
    rwgisterForContextMenu(getListView());
    setHasOptionsMenu(true);
        } */


    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        // TODO Auto-generated method stub

        Toast.makeText(getApplicationContext(), "Selected ID :" + arg2, Toast.LENGTH_SHORT).show();

        Intent updateDeleteLoginInfo = new Intent (this, UpdateDeleteLoginList.class);


        Cursor clickedObject = (Cursor)loginList.getItemAtPosition(arg2);

        Bundle loginBundle = new Bundle();
        loginBundle.putString("clickedWebSite",((LoginDetails) clickedObject).getsName());
        loginBundle.putString("clickedWebAddress",((LoginDetails) clickedObject).getwUrl());
        loginBundle.putString("clickedUserName",((LoginDetails) clickedObject).getuName());
        loginBundle.putString("clickedPassWord",((LoginDetails) clickedObject).getpWord());
        loginBundle.putString("clickedNotes",((LoginDetails) clickedObject).getlNotes());

        updateDeleteLoginInfo.putExtras(loginBundle);

        startActivityForResult(updateDeleteLoginInfo, 0); 
    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        Intent webLoginIntent = new Intent (this, LoginPlusActivity.class);
        startActivity(webLoginIntent);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int ignored, final Bundle args) {
        return new CursorLoader(this, ListProvider.CONTENT_URI, null, null, null, null);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        adapter.swapCursor(cursor); /* swapCursor error: The method swapCursor(Cursor) is undefined for the type SimpleCursorAdapter */


    }

    @Override
    public void onLoaderReset (Loader<Cursor> loader) {
        adapter.swapCursor(null); /* swapCursor error: The method swapCursor(Cursor) is undefined for the type SimpleCursorAdapter */

    }
}

【问题讨论】:

  • 确保您导入的是 android.support.v4.widget.CursorAdapter 而不是 android.widget.CursorAdapter
  • @vmironov 添加了导入但错误仍然存​​在
  • vmironov 的意思可能是使用android.support.v4.widget.SimpleCursorAdapter 而不是android.widget.SimpleCursorAdapter。或者,changeCursor 在所有版本中都可用,但有关闭旧光标的缺点(因此加载程序代码可能会失败)
  • 能否格式化上面的代码,因为无法阅读?
  • 你有最新版本的兼容库吗?

标签: android listview android-arrayadapter simplecursoradapter android-cursor


【解决方案1】:

关于如何将 changeCursor() 与 LoaderManager.LoaderCallbacks 一起使用而不是 swapCursor() 的示例。

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return new CursorLoader(this, DB_table.CONTENT_URI, DB_table.PROJECTION,null,null,null);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    mAdapter.changeCursor(data);
}

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

如果您想将 API 11 中可用的 swapCursor() 用于旧 API,请记住从支持库中导入 CursorAdapter。

import android.support.v4.widget.CursorAdapter;

【讨论】:

    【解决方案2】:

    在您的onCreate() 方法中,您初始化您的适配器并传递ListView 作为第二个参数。这是不正确的,它应该是为列表中的每个项目实例化的布局的 ID:

    adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null, from, to);
    

    除此之外,您的代码在我看来还不错。我已经将它与我使用 ListFragment 的工作代码进行了比较,因此我没有实例化 UI,而是覆盖了 onActivityCreated(Bundle) 方法。

    我确实不厌其烦地提供了一个预测来减少我的ContentProvider 从数据库中提取的数据量,但是通过null 应该不是问题。

    但请确保您在 ContentProvier 中提供了“_id”主键列作为 long。要使用 ListView(和其他一些小部件),您必须有一个基于 Long 的主键,我发现这真的很不方便,因为我已经有一个完全可以接受的 UUID 作为我的主键。

    【讨论】:

      猜你喜欢
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      相关资源
      最近更新 更多