2012-03-08 45 views
2

我從ViewPager實施ListFragment一個SimpleCursorAdapter和使用ListAdapter延伸SimpleCursorAdapter,並試圖我是在轉換之前使用相同的持有人格局繼續使用自定義光標和一個LoaderManagerCommonsWare.loaderex JAR。除了我將LoaderManager放在ListFragment上,而不是在FragmentActivityViewPager上以外,一切似乎都合適。主要是因爲我不確定是否需要回調以從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); 

} 
} 

回答

9

的getSupportLoaderManager()標記爲錯誤,我想不通爲什麼。

那是因爲在Fragment上沒有這樣的方法。撥打getActivity().getSupportLoaderManager()即可獲得您的LoaderManager

+0

我添加了'getActivity()',但我必須真的搞砸了,因爲我現在正在獲取以下消息LoaderManager類型的方法initLoader(int,Bundle,LoaderManager.LoaderCallbacks )不適用於參數(int,null,FragmentActivity)'。 – ewjames 2012-03-08 14:18:54

+1

@ewjames:那是因爲你對initLoader()的第三個參數沒有實現'LoaderCallbacks'。你在'Fragment'上實現了'LoaderCallbacks';因此,傳遞'Fragment'作爲第三個參數。 – CommonsWare 2012-03-08 14:23:26

+0

我在編輯時做了一些檢查,只是將我的'initLoader(0,null,getActivity())'改爲'initLoader(0,null,this)',然後修復了我的查詢,並且通過了錯誤但我得到臭名昭着的'_id'列。我認爲這個限制不是這個方法的一部分,或者是SimpleCursorAdapter在這裏絆倒我? – ewjames 2012-03-08 14:52:36