Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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 在API8中使用加载器_Android_Api_Loader - Fatal编程技术网

Android 在API8中使用加载器

Android 在API8中使用加载器,android,api,loader,Android,Api,Loader,下面是Lars Vogella的教程: 但我希望它能在API 8上工作。我让它在API11+上运行,并做了以下操作使它在API8上运行。在Android Tools上,我添加了一个支持库,并添加了以下导入: import android.support.v4.app.ListFragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import an

下面是Lars Vogella的教程:

但我希望它能在API 8上工作。我让它在API11+上运行,并做了以下操作使它在API8上运行。在Android Tools上,我添加了一个支持库,并添加了以下导入:

import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
但Eclipse还是给了我一个错误:

The method getLoaderManager() is undefined for the type TodosOverviewActivity
在方法中:

private void fillData() {

    // Fields from the database (projection)
    // Must include the _id column for the adapter to work
    String[] from = new String[] { TodoTable.COLUMN_SUMMARY };
    // Fields on the UI to which we map
    int[] to = new int[] { R.id.label };

    getLoaderManager().initLoader(0, null, this);
    adapter = new SimpleCursorAdapter(this, R.layout.todo_row, null, from,
        to, 0);

    setListAdapter(adapter);
  }
有人能解释一下这个错误吗


我找到了以下“解决方案”,但我不确定如何在教程中实现这一点,这是让getSupportLoaderManager()和ListView相关方法可用的解决方案吗?如果是,我如何正确实现这一点

public class TodosOverviewActivity extends FragmentActivity {

public static class TodosOverviewListFragment extends ListFragment
        implements LoaderManager.LoaderCallbacks<Cursor> {
公共类TodosOverviewActivity扩展了FragmentActivity{
公共静态类TodosOverviewListFragment扩展ListFragment
实现LoaderManager.LoaderCallbacks{

总类:

public class TodosOverviewActivity extends FragmentActivity implements
    LoaderManager.LoaderCallbacks<Cursor> {
  private static final int ACTIVITY_CREATE = 0;
  private static final int ACTIVITY_EDIT = 1;
  private static final int DELETE_ID = Menu.FIRST + 1;
  // private Cursor cursor;
  private SimpleCursorAdapter adapter;


/** Called when the activity is first created. */

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.todo_list);
    this.getListView().setDividerHeight(2);
    fillData();
    registerForContextMenu(getListView());
  }

  // Create the menu based on the XML defintion
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.listmenu, menu);
    return true;
  }

  // Reaction to the menu selection
  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.insert:
      createTodo();
      return true;
    }
    return super.onOptionsItemSelected(item);
  }

  @Override
  public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case DELETE_ID:
      AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
          .getMenuInfo();
      Uri uri = Uri.parse(MyTodoContentProvider.CONTENT_URI + "/"
          + info.id);
      getContentResolver().delete(uri, null, null);
      fillData();
      return true;
    }
    return super.onContextItemSelected(item);
  }

  private void createTodo() {
    Intent i = new Intent(this, TodoDetailActivity.class);
    startActivityForResult(i, ACTIVITY_CREATE);
  }

  // Opens the second activity if an entry is clicked
  @Override
  protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Intent i = new Intent(this, TodoDetailActivity.class);
    Uri todoUri = Uri.parse(MyTodoContentProvider.CONTENT_URI + "/" + id);
    i.putExtra(MyTodoContentProvider.CONTENT_ITEM_TYPE, todoUri);

    // Activity returns an result if called with startActivityForResult
    startActivityForResult(i, ACTIVITY_EDIT);
  }



  private void fillData() {

    // Fields from the database (projection)
    // Must include the _id column for the adapter to work
    String[] from = new String[] { TodoTable.COLUMN_SUMMARY };
    // Fields on the UI to which we map
    int[] to = new int[] { R.id.label };

    getSupportLoaderManager().initLoader(0, null, this);
    adapter = new SimpleCursorAdapter(this, R.layout.todo_row, null, from,
        to, 0);

    setListAdapter(adapter);
  }

  @Override
  public void onCreateContextMenu(ContextMenu menu, View v,
      ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add(0, DELETE_ID, 0, R.string.menu_delete);
  }

  // Creates a new loader after the initLoader () call
  @Override
  public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String[] projection = { TodoTable.COLUMN_ID, TodoTable.COLUMN_SUMMARY };
    CursorLoader cursorLoader = new CursorLoader(this,
        MyTodoContentProvider.CONTENT_URI, projection, null, null, null);
    return cursorLoader;
  }

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

  @Override
  public void onLoaderReset(Loader<Cursor> loader) {
    // data is not available anymore, delete reference
    adapter.swapCursor(null);
  }

} 
公共类TodosOverviewActivity扩展了FragmentActivity实现
LoaderManager.LoaderCallbacks{
私有静态最终整数活动_CREATE=0;
私有静态最终整数活动_EDIT=1;
私有静态最终int DELETE_ID=Menu.FIRST+1;
//私有游标;
专用SimpleCursorAdapter适配器;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.todo_列表);
this.getListView().setDividerHeight(2);
fillData();
registerForContextMenu(getListView());
}
//基于XML定义创建菜单
@凌驾
公共布尔onCreateOptions菜单(菜单){
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。列表菜单,菜单);
返回true;
}
//对菜单选择的反应
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
案例R.id.插入:
createTodo();
返回true;
}
返回super.onOptionsItemSelected(项目);
}
@凌驾
公共布尔值onContextItemSelected(MenuItem项){
开关(item.getItemId()){
案例编号:
AdapterContextMenuInfo信息=(AdapterContextMenuInfo)项
.getMenuInfo();
Uri=Uri.parse(MyTodoContentProvider.CONTENT_Uri+“/”
+信息id);
getContentResolver().delete(uri,null,null);
fillData();
返回true;
}
返回super.onContextItemSelected(项目);
}
私有void createTodo(){
Intent i=新Intent(这是TodoDetailActivity.class);
startActivityForResult(i,活动\创建);
}
//如果单击条目,则打开第二个活动
@凌驾
受保护的void onListItemClick(列表视图l、视图v、整数位置、长id){
super.onListItemClick(左、右、位置、id);
Intent i=新Intent(这是TodoDetailActivity.class);
uritodouri=Uri.parse(MyTodoContentProvider.CONTENT_Uri+“/”+id);
i、 putExtra(MyTodoContentProvider.CONTENT\u ITEM\u TYPE,todoUri);
//如果使用startActivityForResult调用,“活动”将返回一个结果
startActivityForResult(一,活动编辑);
}
私有void fillData(){
//数据库中的字段(投影)
//必须包含_id列,适配器才能工作
String[]from=新字符串[]{TodoTable.COLUMN_SUMMARY};
//我们映射到的UI上的字段
int[]to=newint[]{R.id.label};
getSupportLoaderManager().initLoader(0,null,this);
adapter=new SimpleCursorAdapter(this,R.layout.todo_行,null,from,
至(0);
setListAdapter(适配器);
}
@凌驾
public void onCreateContextMenu(ContextMenu,视图v,
上下文菜单信息(menuInfo){
super.onCreateContextMenu(menu,v,menuInfo);
menu.add(0,DELETE\u ID,0,R.string.menu\u DELETE);
}
//在initLoader()调用之后创建新的加载程序
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
String[]projection={TodoTable.COLUMN\u ID,TodoTable.COLUMN\u SUMMARY};
游标装入器游标装入器=新游标装入器(此,
MyTodoContentProvider.CONTENT\u URI,投影,null,null,null);
返回游标装入器;
}
@凌驾
public void onLoadFinished(加载器、光标数据){
适配器。swapCursor(数据);
}
@凌驾
公共void onLoaderReset(加载器){
//数据不再可用,请删除引用
适配器.swapCursor(空);
}
} 

ToDoSurveViewActivity应该扩展FragmentActivity,您应该使用getSupportLoaderManager()

问题是您扩展的是“ListActivity”而不是“ListFragment”

如果利用ListFragment,则可以从支持库访问getLoaderManager()

public class TodosOverviewActivity extends ListFragment {
  private void fillData() {
    getLoaderManager().initLoader(...);
  }
}

您的活动是否正在扩展
FragmentActivity
?谢谢,如果我使用ListFragment进行扩展,我将无法访问例如setContentView。如果我使用FragmentActivity进行扩展,我将无法访问ListView方法。有什么窍门吗?如果您的布局不太简单,请不要使用ListFragment或列表活动。在这种情况下,请使用norm调用活动或片段并自己添加ListView。您好,我如何获得对例如setListAdapter()的访问权限?