我從ViewPager
實施ListFragment
一個SimpleCursorAdapter和使用ListAdapter
延伸SimpleCursorAdapter
,並試圖我是在轉換之前使用相同的持有人格局繼續使用自定義光標和一個LoaderManager
CommonsWare.loaderex
JAR。除了我將LoaderManager
放在ListFragment
上,而不是在FragmentActivity
的ViewPager
上以外,一切似乎都合適。主要是因爲我不確定是否需要回調以從FragmentActivity
加載/刷新列表中的數據,並且我想避免在內存中存在巨大的光標,因爲整個表單在ViewPager
中的所有片段中都有很多字段。表單的每個部分在自己的Loader中管理自己的數據似乎沒有問題。
當我建立類似的演示項目適配器初始化設置(見下面的代碼片段)使用ListFragment與持有人模式
private void initList() {
getHelper();
adapter=new PhoneNumberListAdapter(getActivity(), R.layout.phonenumber_row, null, null, null);
setListAdapter(adapter);
getSupportLoaderManager().initLoader(0, null, getActivity());
}
的getSupportLoaderManager()
標記爲錯誤,我想不通爲什麼。這是Fragment的完整代碼(我知道這是一個蹩腳的電話號碼管理器)。任何關於我做錯了什麼的指導都會很棒。
package com.code.android.myproject
import java.util.ArrayList;
import java.util.List;
import com.commonsware.cwac.loaderex.acl.SQLiteCursorLoader;
import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.widget.SimpleCursorAdapter;
import android.content.Intent;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.view.ContextMenu;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import com.code.android.myproject.R;
import com.code.android.myproject.utilities.PhoneNumberListAdapter;
import com.code.android.myproject.data.AbstractDbAdapter;
import com.code.android.myproject.data.ActorDbAdapter;
public class ActorPhoneNumberListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
public final static String ID_EXTRA="com.code.android.myproject.actorid";
protected final static String TAG = "ActorPhoneNumberListFragment";
private SQLiteCursorLoader loader=null;
private PhoneNumberListAdapter adapter=null;
private ActorDbAdapter helper=null;
private String actorId = null;
//private SharedPreferences prefs=null;
OnActorPhoneNumberListListener listener=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
initList();
}
@Override
public void onPause() {
helper.close();
Log.w(TAG, "Closing database");
super.onPause();
}
@Override
public void onListItemClick(ListView list, View view, int position, long id) {
if (listener!=null) {
int mId = Integer.parseInt(actorId);
listener.onActorPhoneNumberListSelected(mId);
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.contactlist_opton, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId()==R.id.addselected) {
startActivity(new Intent(getActivity(), PersonForm.class));
return(true);
} else if (item.getItemId()==R.id.help) {
startActivity(new Intent(getActivity(), HelpPage.class));
return(true);
} else if (item.getItemId()==R.id.personRefresh) {
startActivity(new Intent(getActivity(), PersonList.class));
return(true);
} else
return(super.onOptionsItemSelected(item));
}
public void setOnActorPhoneNumberListListener(OnActorPhoneNumberListListener listener) {
this.listener=listener;
}
public void loadPhoneNumbers(String actorId) {
this.actorId=actorId;
if (actorId!=null) {
initList();
}
}
private void initList() {
getHelper();
adapter=new PhoneNumberListAdapter(getActivity(), R.layout.phonenumber_row, null, null, null);
setListAdapter(adapter);
getSupportLoaderManager().initLoader(0, null, getActivity());
}
private void getHelper() {
if (helper==null) {
helper=new ActorDbAdapter(getActivity());
Log.w(TAG, "Creating a new instance of the database helper object");
}
helper.open();
Log.w(TAG, "Opening database");
}
@Override
public void onDestroy() {
super.onDestroy();
helper.close();
}
public interface OnActorPhoneNumberListListener {
void onActorPhoneNumberListSelected(long id);
}
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle args) {
loader = new SQLiteCursorLoader(getActivity(), helper.mDb, AbstractDbAdapter.PHONE_VIEW, null);
return (loader);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
adapter.changeCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.changeCursor(null);
}
}
我添加了'getActivity()',但我必須真的搞砸了,因爲我現在正在獲取以下消息LoaderManager類型的方法initLoader(int,Bundle,LoaderManager.LoaderCallbacks)不適用於參數(int,null,FragmentActivity)'。 –
ewjames
2012-03-08 14:18:54
@ewjames:那是因爲你對initLoader()的第三個參數沒有實現'LoaderCallbacks'。你在'Fragment'上實現了'LoaderCallbacks';因此,傳遞'Fragment'作爲第三個參數。 – CommonsWare 2012-03-08 14:23:26
我在編輯時做了一些檢查,只是將我的'initLoader(0,null,getActivity())'改爲'initLoader(0,null,this)',然後修復了我的查詢,並且通過了錯誤但我得到臭名昭着的'_id'列。我認爲這個限制不是這個方法的一部分,或者是SimpleCursorAdapter在這裏絆倒我? – ewjames 2012-03-08 14:52:36