getListAdapter()从ListFragment返回null,getListView工作

问题描述:

按标题,我被堵在这个荒谬的问题getListAdapter()从ListFragment返回null,getListView工作

我有一个ListFragment,这里的精简代码:

public class AlarmsListFragment extends ListFragment implements AbsListView.OnItemClickListener { 
    public ListAdapter mAdapter; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setRetainInstance(true); 

     mAdapter = new AlarmsAdapter(getActivity(), R.layout.alarm_card_item, alarmsList); 
    } 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_alarms_list, container, false); 

     mListView = (AbsListView) view.findViewById(android.R.id.list); 
     mListView.setAdapter(mAdapter); 

     mListView.setOnItemClickListener(this); 

     return view; 
    } 
} 

而且然后有一个活动:

public class MainActivity extends Activity implements AlarmsListFragment.OnAlarmSelectedListener { 
ListFragment mAlarmsListFragment; 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     FragmentManager fm = getFragmentManager(); 
     mAlarmsListFragment = (ListFragment) fm.findFragmentByTag(ALARM_LIST_TAG); 
     if (mAlarmsListFragment == null) 
     { 
      mAlarmsListFragment = new AlarmsListFragment(); 
      getFragmentManager().beginTransaction() 
        .add(R.id.listContainer, mAlarmsListFragment, ALARM_LIST_TAG) 
        .commit(); 
     } 
    } 

后来,onOptionsItemSelected,我有一些代码,需要将项目添加到ListAdapter和无效前面的列表,所以我打电话:

AlarmsAdapter mAdapater = (AlarmsAdapter) mAlarmsListFragment.getListAdapter(); 
mAdapater.add(a); 
mAdapater.notifyDataSetChanged(); 

事情是,我得到一个NullPointerException因为getListAdapter()返回null,而getListView()工作正常..什么可能导致这个错误?

+0

您是否尝试过在您的listfragment上创建自己的getadapter方法?并返回mAdapter? – 2014-09-22 16:36:51

+0

这是我见过的最快的正确回复,mAlarmsListFragment.getListView()。getAdapter()工作,大小写关闭......但为什么getListAdapter()在这种情况下工作? – Mdk 2014-09-22 16:37:08

你需要调用setListAdapterListFragment,即:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setRetainInstance(true); 

    mAdapter = new AlarmsAdapter(getActivity(), R.layout.alarm_card_item, alarmsList); 

    setListAdapter(mAdapter); 
} 

你不需要调用setAdapter您的ListView。 ListFragment将处理它。

+0

这就解释了为什么我需要mAlarmsListFragment.getListView()。getAdapter()而不是getListAdapter ...两者之间有什么区别?编辑:哦,好的,setListAdapter不需要在setAdapter时引用列表,这就是为什么get语句搞乱了 – Mdk 2014-09-22 16:38:39