Android 在API8中使用加载器
下面是Lars Vogella的教程: 但我希望它能在API 8上工作。我让它在API11+上运行,并做了以下操作使它在API8上运行。在Android Tools上,我添加了一个支持库,并添加了以下导入: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
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()的访问权限?