使用ListFragment与持有人模式一SimpleCursorAdapter [英] Using a ListFragment with a SimpleCursorAdapter with the Holder Pattern

查看:153
本文介绍了使用ListFragment与持有人模式一SimpleCursorAdapter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我实施 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;
。进口的Andr​​oid 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 a ViewPager and using a ListAdapter extending SimpleCursorAdapter and trying to keep the same Holder Pattern I was using before the conversion to using a LoaderManager with custom cursor and the CommonsWare.loaderex JAR. Everything seems to be fitting together well except I placed the LoaderManager on the ListFragment and not in the FragmentActivity hosting the ViewPager. Mostly because I was not sure about the required call backs to load / refresh the data in the list from the FragmentActivity 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 the ViewPager. 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. Call getActivity().getSupportLoaderManager() to get your LoaderManager.

这篇关于使用ListFragment与持有人模式一SimpleCursorAdapter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆