【问题标题】:Add a ListView to a Fragment with Crash将 ListView 添加到崩溃的片段
【发布时间】:2014-07-19 22:52:31
【问题描述】:

我正在尝试将我的整个 ListFragment 类转换为添加了 ListView 的 Fragment 类。

调用这个类 HomeworkListFragment。我将扩展名从 ListFragment 更改为 Fragment:

因此,我创建了以下内容:

public class HomeworkListFragment extends Fragment{

public static final String TAG = "HomeworkListFragment";

public ListView mListView;
public HomeworkAdapter mAdapter;

private ArrayList<HomeworkObject> mCrimes;


@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);

    getActivity().setTitle(R.string.homework_title);
    mCrimes = HomeworkLab.get(getActivity()).getHomework();

    mAdapter = new HomeworkAdapter(mCrimes);
    mListView.setAdapter(mAdapter);

    setRetainInstance(true);

}

@TargetApi(11)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){
    View v = super.onCreateView(inflater,parent,savedInstanceState);

    mListView = (ListView)v.findViewById(android.R.id.list);
    mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

    mListView.setMultiChoiceModeListener(new MultiChoiceModeListener(){
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            switch (item.getItemId()){
                case R.id.menu_item_delete_homework:
                    HomeworkLab homeworkLab = HomeworkLab.get(getActivity());
                    for (int i = mAdapter.getCount() - 1;i>=0;i--){
                        //if (mListView.getListView().isItemChecked(i)){
                            //homeworkLab.deleteHomework(mAdapter.getItem(i));
                        //}
                    }
                    mode.finish();
                    mAdapter.notifyDataSetChanged();
                    return true;
                default:
                    return false;
            }
        }

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            //ActionMode.callback Methods
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.homework_list_item_context, menu);
            return true;
        }

        @Override
        public void onDestroyActionMode(ActionMode arg0) {
            //not used here
        }

        @Override
        public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
            //not used here
            return false;
        }

        @Override
        public void onItemCheckedStateChanged(ActionMode arg0,
                int arg1, long arg2, boolean arg3) {
            //not used here
        }

    });
    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            HomeworkObject c = mAdapter.getItem(position);
            //Start CrimeActivity
            //Intent i = new Intent(getActivity(), CrimeActivity.class);
            Intent i = new Intent(getActivity(), HomeworkPagerActivity.class);
            i.putExtra(HomeworkFragment.EXTRA_HOMEWORK_ID, c.getId());
            startActivity(i);               
        }

    });     
    return v;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
    super.onCreateOptionsMenu(menu,inflater);
    inflater.inflate(R.menu.fragment_homework_list, menu);
}

@TargetApi(11)
@Override
public boolean onOptionsItemSelected(MenuItem item){
    switch(item.getItemId()){
        case R.id.menu_item_new_homework:
            HomeworkObject homework = new HomeworkObject();
            homework.setTitle("");
            HomeworkLab.get(getActivity()).addHomework(homework);
            Intent i = new Intent(getActivity(),HomeworkPagerActivity.class);
            i.putExtra(HomeworkFragment.EXTRA_HOMEWORK_ID, homework.getId());
            startActivityForResult(i,0);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    getActivity().getMenuInflater().inflate(R.menu.homework_list_item_context, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
    int position = info.position;
    HomeworkObject h = mAdapter.getItem(position);

    switch (item.getItemId()) {
        case R.id.menu_item_delete_homework:
            HomeworkLab.get(getActivity()).deleteHomework(h);
            mAdapter.notifyDataSetChanged();
            return true;
    }
    return super.onContextItemSelected(item);
}


@Override
public void onResume() {
    super.onResume();
    mAdapter.notifyDataSetChanged();
    mCrimes = HomeworkLab.get(getActivity()).getHomework();//update list
}

@Override
public void onPause(){
    super.onPause();
    HomeworkLab.get(getActivity()).saveHomework();
}

/*@Override
public void onListItemClick(ListView l, View v, int position, long id){
    HomeworkObject c = ((HomeworkAdapter)getListAdapter()).getItem(position);
    //Start CrimeActivity
    //Intent i = new Intent(getActivity(), CrimeActivity.class);
    Intent i = new Intent(getActivity(), HomeworkPagerActivity.class);
    i.putExtra(HomeworkFragment.EXTRA_HOMEWORK_ID, c.getId());
    startActivity(i);
}*/

private class HomeworkAdapter extends ArrayAdapter<HomeworkObject>{
    public HomeworkAdapter(ArrayList<HomeworkObject> crimes){
        super(getActivity(), 0, crimes);
    }

    @SuppressLint("SimpleDateFormat")
    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        if (convertView == null){
            convertView = getActivity().getLayoutInflater().inflate(R.layout.list_item_homework, null);
        }
        HomeworkObject c = getItem(position);

        TextView titleTextView = (TextView)convertView.findViewById(R.id.homework_list_item_titleTextView);
        titleTextView.setText(c.getTitle());
        TextView dateTextView = (TextView)convertView.findViewById(R.id.homework_list_item_dateTextView);

        DateFormat df = new SimpleDateFormat("EEEE, d MMMM yyyy");     
        String reportDate = df.format(c.getDate());
        dateTextView.setText(reportDate);
        //dateTextView.setText(c.getDate().toString());

        CheckBox solvedCheckBox = (CheckBox)convertView.findViewById(R.id.homework_list_item_solvedCheckBox);
        solvedCheckBox.setChecked(c.isSolved());

        return convertView;
    }
}

}

据我所知,onCreateView 方法中有一个错误,带有一些空指针错误,但我无法确定这个问题的正面或反面。

我最近从 iOS 迁移到 Android,所以我对此很陌生。任何解释都会有很大帮助!

【问题讨论】:

  • onCreateView() 的第 59 行是什么?
  • 第 59 行是 mListView = (ListView)v.findViewById(android.R.id.list);
  • 会不会是这个列表未定义?
  • onCreateView()中的第一行改为View v = inflater.inflate(R.layout.my_fragment_layout, parent, false);
  • 看起来你没有正确地扩展你的片段布局,所以当第 59 行试图查看 v 内部以获取对你的列表的引用时,它会抛出一个空指针。跨度>

标签: java android listview android-activity fragment


【解决方案1】:

问题:

 mListView = (ListView)v.findViewById(android.R.id.list);

android.R.id.list 仅绑定到 ListFragment 而不是 Fragment,这就是它为 null 的原因。

作为 ListFragment 的documentation

ListFragment has a default layout that consists of a single list view. 
However, if you desire, you can customize the fragment layout by returning 
your own view hierarchy from onCreateView(LayoutInflater, ViewGroup, Bundle). 
To do this, your view hierarchy must contain a ListView object with the 
id "@android:id/list" (or list if it's in code)

解决方案:

您需要在片段中填充视图并使用 ListView 创建布局并使用创建的 ListView ID 而不是 android.R.id.list

【讨论】:

  • 非常感谢!这澄清了我的问题。我已经成功解决了这个问题!
【解决方案2】:

改用这个:

@TargetApi(11)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){
    super.onCreateView(inflater,parent,savedInstanceState);

    View v = inflater.inflate(R.layout.my_fragment_layout, parent, false);

    mListView = (ListView)v.findViewById(android.R.id.list);
    mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

    mListView.setMultiChoiceModeListener(new MultiChoiceModeListener(){
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            switch (item.getItemId()){
                case R.id.menu_item_delete_homework:
                    HomeworkLab homeworkLab = HomeworkLab.get(getActivity());
                    for (int i = mAdapter.getCount() - 1;i>=0;i--){
                        //if (mListView.getListView().isItemChecked(i)){
                            //homeworkLab.deleteHomework(mAdapter.getItem(i));
                        //}
                    }
                    mode.finish();
                    mAdapter.notifyDataSetChanged();
                    return true;
                default:
                    return false;
            }
        }

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            //ActionMode.callback Methods
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.homework_list_item_context, menu);
            return true;
        }

        @Override
        public void onDestroyActionMode(ActionMode arg0) {
            //not used here
        }

        @Override
        public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
            //not used here
            return false;
        }

        @Override
        public void onItemCheckedStateChanged(ActionMode arg0,
                int arg1, long arg2, boolean arg3) {
            //not used here
        }

    });
    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            HomeworkObject c = mAdapter.getItem(position);
            //Start CrimeActivity
            //Intent i = new Intent(getActivity(), CrimeActivity.class);
            Intent i = new Intent(getActivity(), HomeworkPagerActivity.class);
            i.putExtra(HomeworkFragment.EXTRA_HOMEWORK_ID, c.getId());
            startActivity(i);               
        }

    });     
    return v;
}

【讨论】:

  • 谢谢,我的列表视图现在加载正常!
猜你喜欢
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
相关资源
最近更新 更多