Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 非空ListView给出无效索引0的错误,大小为0_Java_Android_Listview_Android Listview - Fatal编程技术网

Java 非空ListView给出无效索引0的错误,大小为0

Java 非空ListView给出无效索引0的错误,大小为0,java,android,listview,android-listview,Java,Android,Listview,Android Listview,我有一个ListView片段,我在其中注册了上下文菜单的ListView: CourseArrayAdapter adapter = new CourseArrayAdapter(getActivity(), register.getCourseListByGrade(grade)); setListAdapter(adapter); getListView().setLongClickable(true); registerForContextMenu(getListV

我有一个ListView片段,我在其中注册了上下文菜单的ListView:

CourseArrayAdapter adapter = new CourseArrayAdapter(getActivity(), register.getCourseListByGrade(grade));
    setListAdapter(adapter);
    getListView().setLongClickable(true);
    registerForContextMenu(getListView());
我确信我的适配器包含一个非空列表,因为它在ListView中填充了我的自定义视图

上下文菜单相关方法:

    @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    MenuInflater inflater = getActivity().getMenuInflater();
    inflater.inflate(R.menu.menu_course_context, menu);
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
    menu.setHeaderTitle(((CourseArrayAdapter)getListAdapter()).getItem(info.position).getCourseName());
}

@Override
public boolean onContextItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case R.id.action_remove:
            register.removeCourse(((CourseArrayAdapter) getListAdapter()).getItem(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).position).getId());
            return true;
        case R.id.action_edit:
            register.editCourse(((CourseArrayAdapter) getListAdapter()).getItem(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).position).getId());
            return true;
    }
    return super.onContextItemSelected(item);
}
onCreatedContextMenu
中调用
getListAdapter().getItem(info.position)
不会出错,并显示正确的菜单标题。但是,单击选项后,将显示以下错误:

08-14 16:02:46.964 1923-1923/com.andhruv.schoolapp E/MessageQueue JNI﹕ java.lang.IndexOutOfBoundsException:索引0无效,大小为0
位于java.util.ArrayList.ThrowindexOutfBoundsException(ArrayList.java:255)
获取(ArrayList.java:308)
位于android.widget.ArrayAdapter.getItem(ArrayAdapter.java:337)
在com.andhruv.schoolapp.CourseListFragment.onContextItemSelected上(CourseListFragment.java:62)
在android.support.v4.app.Fragment.performContextItemSelected(Fragment.java:1912)

java:62是行

register.editCourse(((CourseArrayAdapter) getListAdapter()).getItem(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).position).getId());
课程简介:

class CourseArrayAdapter extends ArrayAdapter<Course> {
private Gpa gpaCalculator;

public CourseArrayAdapter(Context context, List<Course> values) {
    super(context, 0,values);
    gpaCalculator = new Gpa();
}

@Override
public  View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.item_course,parent,false);
    TextView textViewCourseName = (TextView)rowView.findViewById(R.id.textViewCourseName);
    TextView textViewGpa = (TextView)rowView.findViewById(R.id.textViewGpa);
    TextView textViewGrade = (TextView)rowView.findViewById(R.id.textViewGrade);
    TextView textViewType = (TextView)rowView.findViewById(R.id.textViewType);
    TextView textViewCategory = (TextView)rowView.findViewById(R.id.textViewCategory);
    textViewCourseName.setText(getItem(position).getCourseName());
    textViewGpa.setText(String.valueOf(gpaCalculator.calcCourseVal(getItem(position).getLetterGrade(),getItem(position).getCourseLevel(),true)));
    textViewType.setText(String.valueOf(getItem(position).getCourseLevel()));
    textViewCategory.setText(String.valueOf(getItem(position).getCategory()).replace('_',' '));
    textViewGrade.setText(String.valueOf(getItem(position).getLetterGrade()));
    textViewCourseName.setTag(getItem(position).getId());
    return rowView;
}
class CourserLayaAdapter扩展了ArrayAdapter{
私人Gpa计算程序;
公共课程arrayadapter(上下文、列表值){
super(上下文,0,值);
gpaCalculator=新的Gpa();
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutInflater充气器=(LayoutInflater)getContext().getSystemService(Context.LAYOUT\u充气器\u SERVICE);
视图行视图=充气机。充气(右布局。项目\路线,父项,false);
TextView textViewCourseName=(TextView)rowView.findViewById(R.id.textViewCourseName);
TextView textViewGpa=(TextView)rowView.findViewById(R.id.textViewGpa);
TextView textViewGrade=(TextView)rowView.findViewById(R.id.textViewGrade);
TextView textViewType=(TextView)rowView.findViewById(R.id.textViewType);
TextView textViewCategory=(TextView)rowView.findViewById(R.id.textViewCategory);
textViewCourseName.setText(getItem(position.getCourseName());
textViewGpa.setText(String.valueOf(gpacalCalculator.calcCourseVal(getItem(position).getLetterGrade(),getItem(position).getCourseLevel(),true));
textViewType.setText(String.valueOf(getItem(position).getCourseLevel());
textViewCategory.setText(String.valueOf(getItem(position).getCategory()).replace(“”,“”));
textViewGrade.setText(String.valueOf(getItem(position).getLetterGrade());
textViewCourseName.setTag(getItem(position.getId());
返回行视图;
}
}


为什么调用
((CourseArrayAdapter)getListAdapter()).getItem(info.position)
在onCreateContextMenu中工作,但在onContextItemSelected中不工作?

我怀疑您在以下代码中没有正确修改适配器:

register.removeCourse(((CourseArrayAdapter) getListAdapter()).getItem(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).position).getId());

对于我来说,很难提出一个完整的代码修复方案,因为您的代码不适合我的编码风格,当然我也不太了解您的代码。但是,我提供了示例代码来从适配器中删除项。基本上,如果要从
列表的集合中添加、删除或编辑数据,需要通知适配器。
示例代码:

adapter = getListAdapter();

adapter.remove(adapter.getItem(position));
adapter.notifyDataSetChanged();

我希望这足够清楚,让您有一个好的开始。

显示课程代码适应程序。您可能没有正确地将代码添加到getItem()或getCount()。@TheOriginalAndroid okay我针对完全相同的问题进行了更新。你解决了吗?
adapter = getListAdapter();

adapter.remove(adapter.getItem(position));
adapter.notifyDataSetChanged();