ViewPager PagerAdapter z kursorem - CursorLoader.onLoadFinished nie wywołuje się z innym zapytaniem
Robię jak aplikacja cytująca, która pobiera cytaty z bazy danych i muszę wyświetlać cytaty w ViewPager.
Stworzyłem mój CursorPagerAdapter, który wydaje się działać dobrze.
public class MyCursorPagerAdapter extends PagerAdapter {
private Cursor cursor;
private LayoutInflater inflater;
public MyCursorPagerAdapter(Context context, Cursor cursor) {
Log.d(MainActivity.TAG, "MyCursorPagerAdapter.onCreate()");
this.cursor = cursor;
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void swapCursor(Cursor cursor) {
//if(cursor != null) {
Log.d(MainActivity.TAG, "swapCursor().");
this.cursor = cursor;
//notifyDataSetChanged();
//}
}
/**
* Metóda destroyItem
*/
@Override
public void destroyItem(View view, int position, Object object) {
//cursor.moveToPosition(position);
((ViewPager) view).removeView((LinearLayout) object);
}
/**
* Vráti počet prvkov
*/
@Override
public int getCount() {
if(cursor == null) {
return 0;
} else {
//return cursor.getCount();
return 1000;
}
}
@Override
public Object instantiateItem(View view, int position) {
position = position % cursor.getCount();
cursor.moveToPosition(position);
LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.pager_item, null);
TextView messageTextView = (TextView) layout.findViewById(R.id.message_textview);
TextView authorTextView = (TextView) layout.findViewById(R.id.author_textview);
messageTextView.setText(cursor.getString(cursor.getColumnIndex(QuoteDatabaseHelper.COLUMN_MESSAGE)));
authorTextView.setText(cursor.getString(cursor.getColumnIndex(QuoteDatabaseHelper.COLUMN_AUTHOR)));
((ViewPager) view).addView(layout);
return layout;
}
/**
* Metóda isViewFromObject
*/
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
Używam także CursorLoader do asynchronicznego ładowania bazy danych
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myCursorPagerAdapter = new MyCursorPagerAdapter(this, null);
pager = (ViewPager) findViewById(R.id.viewPager);
pager.setAdapter(myCursorPagerAdapter);
getSupportLoaderManager().initLoader(-1, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
return new CursorLoader(this, QuoteContentProvider.CONTENT_URI, null, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
Log.d(MainActivity.TAG, "onLoadFinished()");
myCursorPagerAdapter.swapCursor(cursor);
this.cursor = cursor;
pager.setCurrentItem((int) (myCursorPagerAdapter.getCount() / 2), false);
pager.startAnimation(animation);
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
myCursorPagerAdapter.swapCursor(null);
}
}
Z ContentProvider
public class QuoteContentProvider extends ContentProvider {
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor cursor = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, "RANDOM()");
cursor.setNotificationUri(getContext().getContentResolver(), uri);
Log.d(MainActivity.TAG, "QuoteContentProvider.query() - cursor.getCount(): " + cursor.getCount());
// getContext().getContentResolver().notifyChange(uri, null);
return cursor;
}
}
Wszystko działa dobrze, ładnie ładuje wszystkie cytaty, ale teraz muszę przeprowadzić wyszukiwanie. Tworzę więc metodę, która odpytuje bazę danych
public void search(String keyword) {
Log.d(MainActivity.TAG, "Search keyword: " + keyword);
getContentResolver().query(QuoteContentProvider.CONTENT_URI, null, QuoteContentProvider.COLUMN_AUTHOR + " LIKE '%" + keyword + "%' OR " + QuoteContentProvider.COLUMN_MESSAGE + " LIKE '%" + keyword + "%'", null, null);
}
Zapytanie jest dobre, mogę zobaczyć wywołanie ContentProvider.query () i wypisuje cursor.getCount (),
JEDNAK teraz onLoadFinished w MainActivity nie jest wywoływany, nawet jeśli jest ustawiony cursor.setNotificationUri (), i zakładam, że działa, ponieważ działa przy pierwszym uruchomieniu aplikacji.
Próbowałem wstawić niektóre dane z dostawcą treści i wywołać getContext (). GetContentResolver (). NotifyChange (uri, null); i uruchomiło OnLoadFinished, więc nie mam pojęcia, dlaczego ta inna kwerenda nie uruchamia OnLoadFinished.
Dziękuję bardzo, kto to zrozumie.