Vì vậy, tôi có MainDisplayActivity
thực hiện cả hai Activity
và LoaderManager.LoaderCallbacks<Cursor>
. Ở đây tôi có A ListView
, tôi điền thông tin về Chương trình làm việc mà tôi nhận được từ cơ sở dữ liệu của mình bằng cách sử dụng Trình cung cấp nội dung. Tôi cũng có một GridView
là một lịch. Tôi đã thiết lập nó khi nhấp vào một ô, chương trình làm việc được cập nhật với ngày được nhấp. Vấn đề của tôi là khi tái sử dụng Loader tôi tạo ra trong onCreate()
bên trong của setOnItemClickListener(), nó không làm mới thông tin với con trỏ mới mà tôi đang tạo ra. Tôi chỉ có thể tạo Trình tải mới với một ID khác và nó hoạt động một lần, nhưng khi tôi nhấp vào một ngày khác, nó sẽ ngừng làm mới. Vấn đề nằm ở con trỏ. Làm cách nào để làm mới con trỏ từ Trình tải để tôi không phải tiếp tục tạo Trình tải mới? Cảm ơn trước!Làm cách nào để làm mới con trỏ từ Trình tải trang CursorLoader?
gọi ban đầu để tạo ra các Loader trong onCreate() trong lớp MainDisplayActivity
của tôi:
makeProviderBundle(new String[] {"_id, event_name, start_date, start_time, end_date, end_time, location"},
"date(?) >= start_date and date(?) <= end_date", new String[]{getChosenDate(), getChosenDate()}, null);
getLoaderManager().initLoader(0, myBundle, MainDisplayActivity.this);
list.setAdapter(agendaAdapter);
Đây là những phương pháp ghi đè từ LoaderCallbacks<Cursor>
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri baseUri = SmartCalProvider.CONTENT_URI;
return new CursorLoader(this, baseUri, args.getStringArray("projection"),
args.getString("selection"), args.getStringArray("selectionArgs"), args.getBoolean("sortOrder") ? args.getString("sortOrder") : null);
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
agendaAdapter.swapCursor(arg1);
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
//Not really sure how this works. Maybe I need to fix this here?
agendaAdapter.swapCursor(null);
}
public void makeProviderBundle(String[] projection, String selection, String[] selectionArgs, String sortOrder){
/*this is a convenience method to pass it arguments
* to pass into myBundle which in turn is passed
* into the Cursor loader to query the smartcal.db*/
myBundle = new Bundle();
myBundle.putStringArray("projection", projection);
myBundle.putString("selection", selection);
myBundle.putStringArray("selectionArgs", selectionArgs);
if(sortOrder != null) myBundle.putString("sortOrder", sortOrder);
}
Bất kỳ mã bổ sung cần thiết xin vui lòng đừng ngần ngại hỏi . Cám ơn lần nữa cho bất kì sự giúp đỡ nào!
Đó là kinh nghiệm của tôi khi bạn sử dụng 'ContentResolver' để cập nhật nội dung trong' ContentProvider' mà 'con trỏ' được thông báo và danh sách được cập nhật tự động. Bạn có thể đăng mã onClick của mình không? – stuckless
Tôi biết đúng. Tôi cho rằng điều này là tốt vì mọi người đều nói điều đó thuận tiện đến mức nào. Nhưng nó không làm điều đó. Vấn đề là tôi cũng hiểu làm thế nào mà không thể làm việc. Khi 'Loader' được tạo đầu tiên, nó gọi' onCreateLoader() '. Khi gọi 'getLoaderManager(). InitLoader()', nếu arg đầu tiên, ID giống với 'Loader' được khởi tạo trước đó,' onCreateLoader() 'có thể sẽ không được gọi. Tất nhiên đây là suy đoán thuần túy về phía tôi khi tôi vẫn đang học, nhưng tôi đã nghĩ rằng phải có một phương pháp để tải một Con trỏ mới nếu đó là trường hợp. Alex đã đủ tốt để cung cấp nó! – Andy