我正在寻找制作Custom CursorLoader的答案,并且想知道如果数据发生变化会有数据更改的通知,以便列表更新?
我在LoaderManager中使用CursorLoader和Custom CursorAdapter.我已经实现了显示专辑和相关的艺术家,现在我想显示封面.
这是我的Custom CursorAdapter:
public class AlbumsAdapter extends CursorAdapter {
private final LayoutInflater mInflater;
public AlbumsAdapter(Context context, Cursor c) {
super(context, c);
mInflater=LayoutInflater.from(context);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView albumTitle =(TextView)view.findViewById(R.id.albumTextView);
albumTitle.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM)));
TextView artistName=(TextView)view.findViewById(R.id.artistTextView);
artistName.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ARTIST)));
ImageView albumCover=(ImageView)view.findViewById(R.id.artistTextView);
// Here what should I do ?
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
final View view=mInflater.inflate(R.layout.albums_row,parent,false);
return view;
}
}
Run Code Online (Sandbox Code Playgroud)
我试过以下但没有成功:
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
File imgFile = new File(path);
if(imgFile.exists()){
Bitmap …Run Code Online (Sandbox Code Playgroud) android albumart android-imageview android-mediaplayer android-cursorloader
我试图在最小API为10的情况下实现CursorLoader和LoaderManager.
但是,我继续在AsyncTaskLoader.class的第63行获得IllegalArgument异常(AsyncTaskLoader.class的源代码,其中发生异常的是下面和此链接.
/* Runs on the UI thread */
@Override
protected void onPostExecute(D data) {
if (DEBUG) Log.v(TAG, this + " onPostExecute");
try {
AsyncTaskLoader.this.dispatchOnLoadComplete(this, data);
} finally {
done.countDown();
}
}
Run Code Online (Sandbox Code Playgroud)
下面是错误的堆栈:
AsyncTaskLoader$LoadTask.onPostExecute(Object) line: 63
AsyncTaskLoader$LoadTask(ModernAsyncTask).finish(Object) line: 461
ModernAsyncTask.access$500(ModernAsyncTask, Object) line: 47
ModernAsyncTask$InternalHandler.handleMessage(Message) line: 474
ModernAsyncTask$InternalHandler(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 137
ActivityThread.main(String[]) line: 4424
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 511
ZygoteInit$MethodAndArgsCaller.run() line: 784
ZygoteInit.main(String[]) line: 551
NativeStart.main(String[]) …Run Code Online (Sandbox Code Playgroud) sqlite android illegalargumentexception android-loadermanager android-cursorloader
我正在使用基于ActionBarSherlock的活动和片段.要从SQLite数据库中读取行,我正在尝试使用a Loader而不是a ContentProvider,我正在尝试让LoaderEx为我工作.
我遇到了一个顽固的问题:在我的片段onCreateLoader回调中,ADT一直给我一个错误:
"Cannot convert from SQLiteCursorLoader to Loader<Cursor>"
Run Code Online (Sandbox Code Playgroud)
我正在使用Android v4支持库.由于DEX错误,我已从android-support-v4.jarActionBarSherlock和LoaderEx中删除,并将其添加到我的基础项目中.然后我让ABS和LoaderEx都依赖于此.
ABS和LoaderEx都作为库项目添加.
我已经检查过我只使用v4导入.LoaderExDemo也可以在模拟器中编译和工作.
这些是我片段的导入:
import com.actionbarsherlock.app.SherlockListFragment;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v4.app.LoaderManager;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import com.commonsware.cwac.loaderex.SQLiteCursorLoader;
Run Code Online (Sandbox Code Playgroud)
这是我的片段声明:
public class MeetingListFragment
extends SherlockListFragment
implements LoaderManager.LoaderCallbacks<Cursor> {
private JournalDatabaseHelper db = null;
private SimpleCursorAdapter adapter = null;
private SQLiteCursorLoader loader = null;
Run Code Online (Sandbox Code Playgroud)
这是getLoader回调方法:
public Loader<Cursor> onCreateLoader(int loaderId, Bundle args) …Run Code Online (Sandbox Code Playgroud) android android-fragments actionbarsherlock android-cursorloader commonsware-cwac
我正在实施LoaderManager.LoaderCallbacks,以访问我的应用程序的数据库并填充一个ListView.这线程将打电话给我onCreateLoader()和onLoadFinished()?他们是在UI线程或线程上调用CursorLoader的吗?LoaderCallbacks的文档在这一点上是静音的.
我使用的是CursorAdapter和ContentProvider,我想用CursorLoader,所以我重新配置我的项目目标API 11,并设置分-SDK-版本7.但是它崩溃时Activity调用子Activity,它使用CursorLoader.错误NoClassDefFoundError通过IllegalStateException.
我的问题是,即使我们有相同的配置,我们可以在以前的Android版本中使用Honeycomb API吗?
java android android-contentprovider android-loadermanager android-cursorloader
我正在尝试用所有者的电子邮件填充ArrayList.我是在一个片段中这样做的.这是我的代码:
public class ItemDetailFragment extends Fragment implements
LoaderManager.LoaderCallbacks<Cursor> {
ArrayList<String> emails = new ArrayList<String>();
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(0, null, this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View myFragmentView = inflater.inflate(R.layout.formal_email_layout,
container, false);
return myFragmentView;
}
public Loader<Cursor> onCreateLoader(int id, Bundle arguments) {
return new CursorLoader(getActivity(),
// Retrieve data rows for the device user's 'profile' contact.
Uri.withAppendedPath(
ContactsContract.Profile.CONTENT_URI,
ContactsContract.Contacts.Data.CONTENT_DIRECTORY),
ProfileQuery.PROJECTION,
// Select only email addresses.
ContactsContract.Contacts.Data.MIMETYPE + " = ?",
new String[]{ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE}, …Run Code Online (Sandbox Code Playgroud) 我有一个实现LoaderManager.LoaderCallbacks接口的FragmentActivity,我想把它改成一个Fragment,这样我就可以在我的splashscreen后台启动它来从我的数据库中获取信息.但是,当我将FragmentActivity更改为Fragment时,我在onCreateLoader中出错:
public class CursorLoaderTest extends Fragment implements
LoaderManager.LoaderCallbacks<Cursor> {
...
...
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1)
{
// Grab URI corresponding with menuItem table
Uri CONTENT_URI = TabletContentProvider.MENU_ITEM_CONTENT_URI;
// THIS IS WHERE THE ERROR IS
return new CursorLoader(this, CONTENT_URI, null, null, null, null);
}
Run Code Online (Sandbox Code Playgroud)
它希望我将CursorLoader对象构造函数更改为:
CursorLoader(Context);
Run Code Online (Sandbox Code Playgroud)
这显然是行不通的.我正在与一个团队合作开展一个项目,我负责数据库操作,所以我不太熟悉Fragments/FragmentActivities,因为我不是为应用程序的那些部分编写代码.我错过了一些明显的东西吗?
我一直看到"应用程序可能在其主线程上做了太多工作."
这是由我下面的代码中的swapCursor()引起的吗?看起来如此:如果我删除它,上面的警告就会消失.
我仍然不明白为什么它声称是导致问题的主要线程.我已经将swapCursor()移动到各种位置,例如onLoadFinished()和loadInBackground(),但我得到了相同的结果.
如何调用swapCursor()以便不显示此警告?我使用SimpleCursorLoader的全部原因是避免占用主线程,但它仍在发生.
package com.example.sqlitetest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.support.v4.content.CursorLoader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter.ViewBinder;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor>
{
public static Context mContext;
private LoaderManager.LoaderCallbacks<Cursor> mLoaderCallbacks;
public static SQLiteDatabase db;
public …Run Code Online (Sandbox Code Playgroud) android android-listview simplecursoradapter android-loadermanager android-cursorloader