我是android和java的新手,我正在尝试实现异步加载器。但是没有加载数据。我在这里概念性地遗漏了什么吗?
我的活动:
public class TestActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {
ListView bookList;
MyCursorAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin_library);
// dloader = new DBLoader(this);
//dloader.loadInBackground();
/* blah blah*/
getSupportLoaderManager().initLoader(1,null,this);
/* blah blah*/
View header = (View) getLayoutInflater().inflate(R.layout.row_layout_title, null);
TextView totals = header.findViewById(R.id.mainText);
totals.setText("Total Books: " + Integer.toString(totalBooks));
bookList.addHeaderView(header);
bookList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
/* blah blah*/
}
}
});
/* blah blah*/
}
/* blah blah*/
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
/*CursorLoader loader = new CursorLoader(this, null, null, null, null, null){
@Override
public Cursor loadInBackground(){
DBHandler db = new DBHandler(getContext());
return db.getCursor();
}
};*/
DBLoader loader = new DBLoader(this);
return loader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
myAdapter = new MyCursorAdapter(this,data,0);
bookList.setAdapter(myAdapter);
// myAdapter.swapCursor(data);
//myAdapter.notifyDataSetChanged();
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
myAdapter.swapCursor(null);
}
}
DBLoader:
public class DBLoader extends AsyncTaskLoader<Cursor> {
private Cursor mCursor;
Context context;
public DBLoader(Context context) {
super(context);
this.context = context;
}
@Override
public Cursor loadInBackground() {
DBHandler db = new DBHandler(context);
Cursor cursor = db.getCursor();
return cursor;
}
@Override
public void deliverResult(Cursor cursor){
if(isReset()){
releaseResources(cursor);
return;
}
Cursor oldCursor = mCursor;
mCursor = cursor;
if(isStarted()){
super.deliverResult(cursor);
}
if(oldCursor!=null && oldCursor!=cursor){
releaseResources(oldCursor);
}
}
private void releaseResources(Cursor cursor) {
cursor.close();
}
}
我不知道我在这里是否缺少任何重要的电话,互联网上的大多数资源都是关于内容提供商(我不需要)。我只需要从本地SQLite数据库异步加载数据。
编辑:我的适配器:
public class MyCursorAdapter extends CursorAdapter {
private LayoutInflater cursorInflater;
public MyCursorAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
cursorInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return cursorInflater.inflate(R.layout.row_layout, parent, false);
}
@Override
public void bindView(View v, Context context, Cursor cursor) {
Log.d("Cursor :", cursor.getString(1));
TextView title = (TextView) v.findViewById(R.id.listTitle);
title.setText(cursor.getString(1));
TextView author = (TextView) v.findViewById(R.id.listAuthor);
author.setText(cursor.getString(2));
TextView copies = (TextView) v.findViewById(R.id.listCopies);
copies.setText(cursor.getString(5));
}
}
答案 0 :(得分:0)
将您的DBLoader loader
声明为全局变量
在onCreateLoader
loader = new DBLoader(this);
return loader;
将其放在onCreate
方法而不是onLoadFinished
myAdapter = new MyCursorAdapter(this,null,0);
bookList.setAdapter(myAdapter);
将其放在onLoadFinishied
this.loader=(DBLoader)loader;
adapter.changeCursor(cursor);
答案 1 :(得分:0)
经过一番搜索,我在互联网上看到了一些他们使用的例子
一个getSupportLoaderManager().initLoader(1,null,this).forceLoad();
。这似乎有效。同时在loader.forceLoad()
中调用onCreateLoader()
也可以。在进一步检查时,我看到了这一点:https://issuetracker.google.com/issues/36925900
我们似乎必须在forceLoad
中实施onStartLoading()
,因此:
protected void onStartLoading() {
if (mCursor != null) {
deliverResult(mCursor);
}
if (takeContentChanged() || mCursor == null) {
forceLoad();
}
}
这样做将不再需要我们的活动中的.forceLoad()