我试图在我的expandableListView组标题上设置一个setOnLongClickListener以便能够在用户按住按钮时将其删除,为此,我在适配器的getGroupView方法中实现了以下代码。它在方法的最底部:

@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View view, final ViewGroup viewGroup) {
    View vi = view;
    if (vi == null) {

        LayoutInflater groupInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        vi = groupInflater.inflate(R.layout.parent_row, viewGroup, false);
    }

    final Semester semester = getGroup(groupPosition);

    TextView textView = (TextView) vi.findViewById(R.id.semester_view);

    textView.setText(semester.getName());
    textView.setPadding(100, 0, 0, 0);
    textView.setTextColor(Color.BLACK);
    textView.setTextSize(20);

    final Button button = (Button) vi.findViewById(R.id.add_course_button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            View dialogView = LayoutInflater.from(context).inflate(R.layout.child_dialog_layout, null);
            final EditText et_course = (EditText)dialogView.findViewById(R.id.et_course);

            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setTitle("Create A Course");
            builder.setView(dialogView);
            builder.setCancelable(false);

            builder.setPositiveButton("DONE", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Course course = new Course(et_course.getText().toString());
                    getAllData().get(groupPosition).getCourses().add(course);
                    notifyDataSetChanged();
                }
            });
            builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            builder.show();
        }
    });

    view.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            getAllData().remove(groupPosition);
            return false;
        }
    });
    return vi;
}


但是现在,我什至无法创建组头,因为它给了我一个空对象引用。我不明白为什么,因为我的组头已经在我命名时被初始化了。而且,我不知道为什么仅仅因为这行代码而不能让我创建一个组,该行仅添加功能,而不会覆盖其他任何内容。这是堆栈跟踪:

FATAL EXCEPTION: main
  Process: myapp.onur.expandablelistviewexample, PID: 26569
  java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setOnLongClickListener(android.view.View$OnLongClickListener)' on a null object reference
      at myapp.onur.expandablelistviewexample.ExpandableListViewAdapter.getGroupView(ExpandableListViewAdapter.java:127)
      at android.widget.ExpandableListConnector.getView(ExpandableListConnector.java:446)


编辑我遵循KeLiuyue的建议,现在我能够生成组,但是onLongClick给了我这个stacktrace:

FATAL EXCEPTION: main
    Process: myapp.onur.expandablelistviewexample, PID: 31734
    java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
      at java.util.ArrayList.remove(ArrayList.java:477)
      at myapp.onur.expandablelistviewexample.ExpandableListViewAdapter$2.onLongClick(ExpandableListViewAdapter.java:130)

最佳答案

尝试这个:

final int position = groupPosition;

    vi.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {

                long packedPosition = position;
                int groupPosition = ExpandableListView.getPackedPositionGroup(packedPosition);
                int childPosition = ExpandableListView.getPackedPositionChild(packedPosition);
                // childPosition = -1 ,Group was clicked.
                if (childPosition != -1) {
                    // group was clicked ,you can do something here.
                } else {
                    // children was clicked,you can do something here.
                }

                // edited ,getAllData() didn't have data.So you need to judge.
                if (getAllData().size() != 0 && getAllData() != null) {
                    getAllData().remove(groupPosition);
                    notifyDataSetChanged();
                }
                return true;
            }
    });


只需将view更改为vi

您也可以在外面做。

mExpandableListView = (ExpandableListView) findViewById(R.id.list_view);
    mExpandableListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {

            long packedPosition = mExpandableListView.getExpandableListPosition(i);
            int groupPosition = ExpandableListView.getPackedPositionGroup(packedPosition);
            int childPosition = ExpandableListView.getPackedPositionChild(packedPosition);
            // childPosition = -1 ,Group was clicked.
            if (childPosition != -1) {
                // group wa clicked ,you can do something here.
            } else {
                // children was clicked,you can do something here.
            }
            return true;
        }
});

10-01 03:06