使用ListFragment与持有人模式一SimpleCursorAdapter [英] Using a ListFragment with a SimpleCursorAdapter with the Holder Pattern
问题描述
我实施 ListFragment
从 ViewPager
,并使用 ListAdapter
延长 SimpleCursorAdapter
,并试图让我转换到使用前使用相同的持有人模式a LoaderManager
自定义光标和 CommonsWare.loaderex
JAR。一切似乎很好地配合在一起,除了我放在 LoaderManager
在 ListFragment
,而不是在 FragmentActivity
托管 ViewPager
。这主要是因为我不知道有关所需回拨加载/刷新数据从 FragmentActivity
名单,我想,以避免巨大的光标出内存,因为整体形式已经遍及所有的 ViewPager
片段的许多领域。它似乎好于具有以下形式的每个部分在其自己的加载管理其自己的数据。结果,
当我建立类似的演示项目适配器初始化设置(见code以下摘录)
私人无效initList(){
getHelper()方法;
适配器=新PhoneNumberListAdapter(getActivity(),R.layout.phonenumber_row,NULL,NULL,NULL);
setListAdapter(适配器);
getSupportLoaderManager()initLoader(0,空,getActivity())。}
的 getSupportLoaderManager()
标记为错误,我想不出为什么。下面是完整的code的片段(我知道这是一个蹩脚的电话号码管理器)。在我做错了什么任何指导,将是巨大的。
包融为一体code.android.myproject进口的java.util.ArrayList;
进口的java.util.List;进口com.commonsware.cwac.loaderex.acl.SQLiteCursorLoader;
进口android.support.v4.app.ListFragment;
进口android.support.v4.app.LoaderManager;
进口android.support.v4.content.Loader;
进口android.widget.SimpleCursorAdapter;
进口android.content.Intent;
进口android.app.AlertDialog;
进口android.content.ContentValues;
进口android.content.DialogInterface;
进口android.database.Cursor;
进口android.view.ContextMenu;
进口android.os.Bundle;
进口android.util.Log;
进口android.view.Menu;
进口android.view.MenuInflater;
进口android.view.MenuItem;
进口android.view.View;
进口android.widget.ListView;
进口android.content.Shared preferences;
。进口的Android preference preferenceManager。进口玉米code.android.myproject.R。
。进口玉米code.android.myproject.utilities.PhoneNumberListAdapter;
。进口玉米code.android.myproject.data.AbstractDbAdapter;
。进口玉米code.android.myproject.data.ActorDbAdapter;公共类ActorPhoneNumberListFragment扩展ListFragment实现LoaderManager.LoaderCallbacks<&光标GT; {
公共最后静态字符串ID_EXTRA =。com code.android.myproject.actorid
保护最终静态字符串变量=ActorPhoneNumberListFragment;
私人SQLiteCursorLoader装载机= NULL;
私人PhoneNumberListAdapter适配器= NULL;
私人ActorDbAdapter帮手= NULL;
私人字符串的actorId = NULL;
//私人共享preferences preFS = NULL;
OnActorPhoneNumberListListener监听= NULL;@覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
}@覆盖
公共无效onResume(){
super.onResume(); initList();
}@覆盖
公共无效的onPause(){
helper.close();
Log.w(TAG,关闭数据库); super.onPause();
}@覆盖
公共无效onListItemClick(ListView控件列表,查看视图,INT位置,长的id){
如果(听众!= NULL){
INT MID =的Integer.parseInt(actorId来);
listener.onActorPhoneNumberListSelected(MID);
}
}@覆盖
公共无效onCreateOptionsMenu(菜单菜单,MenuInflater气筒){
inflater.inflate(R.menu.contactlist_opton,菜单);
}@覆盖
公共布尔onOptionsItemSelected(菜单项项){
如果(item.getItemId()== R.id.addselected){
startActivity(新意图(getActivity(),PersonForm.class));
返回(真);
}否则如果(item.getItemId()== R.id.help){
startActivity(新意图(getActivity(),HelpPage.class)); 返回(真);
}否则如果(item.getItemId()== R.id.personRefresh){
startActivity(新意图(getActivity(),PersonList.class));
返回(真);
}其他
回报(super.onOptionsItemSelected(项目));
}公共无效setOnActorPhoneNumberListListener(OnActorPhoneNumberListListener监听){
this.listener =侦听器;
}公共无效loadPhoneNumbers(字符串的actorId){
this.actorId = actorId来; 如果(actorId来!= NULL){
initList();
}
}私人无效initList(){
getHelper()方法;
适配器=新PhoneNumberListAdapter(getActivity(),R.layout.phonenumber_row,NULL,NULL,NULL);
setListAdapter(适配器);
getSupportLoaderManager()initLoader(0,空,getActivity())。}私人无效getHelper()方法{
如果(辅助== NULL){
助手=新ActorDbAdapter(getActivity());
Log.w(TAG,创建数据库辅助对象的新实例);
}
helper.open();
Log.w(TAG,打开数据库);
}@覆盖
公共无效的onDestroy(){
super.onDestroy();
helper.close();
}公共接口OnActorPhoneNumberListListener {
无效onActorPhoneNumberListSelected(长ID);
}@覆盖
公共装载机<&光标GT; onCreateLoader(INT loaderId,捆绑参数){
装载机=新SQLiteCursorLoader(getActivity(),helper.mDb,AbstractDbAdapter.PHONE_VIEW,NULL);
返回(装载机);
}@覆盖
公共无效onLoadFinished(装载机<&光标GT;装载机,光标光标){
adapter.changeCursor(光标);}@覆盖
公共无效onLoaderReset(装载机<&光标GT;装载机){
adapter.changeCursor(NULL);}
}
该getSupportLoaderManager()标志为一个错误,我想不出为什么。
块引用>这是因为,在
片段
没有这样的方法。呼叫getActivity()。getSupportLoaderManager()
来得到你的LoaderManager
。I am implementing a
ListFragment
from aViewPager
and using aListAdapter
extendingSimpleCursorAdapter
and trying to keep the same Holder Pattern I was using before the conversion to using aLoaderManager
with custom cursor and theCommonsWare.loaderex
JAR. Everything seems to be fitting together well except I placed theLoaderManager
on theListFragment
and not in theFragmentActivity
hosting theViewPager
. Mostly because I was not sure about the required call backs to load / refresh the data in the list from theFragmentActivity
and I wanted to avoid having a giant cursor out in memory since the overall form has many fields across all of the Fragments in theViewPager
. It seemed okay to have each section of the form manage its own data in its own Loader.
When I build the Adapter Init setup similar to the demo project (see code snippet below)private void initList() { getHelper(); adapter=new PhoneNumberListAdapter(getActivity(), R.layout.phonenumber_row, null, null, null); setListAdapter(adapter); getSupportLoaderManager().initLoader(0, null, getActivity()); }
The
getSupportLoaderManager()
flags as an error and I cannot figure out why. Here is the full code for the Fragment (I know it’s a lame Phone Number Manager). Any guidance on what I did wrong would be great.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); } }
解决方案The getSupportLoaderManager() flags as an error and I cannot figure out why.
That is because there is no such method on
Fragment
. CallgetActivity().getSupportLoaderManager()
to get yourLoaderManager
.这篇关于使用ListFragment与持有人模式一SimpleCursorAdapter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!