java - 无法将 OnLongClickListener 设置为 ExpandableListView 组

标签 java android expandablelistview

我正在尝试在我的 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;
}

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

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 给了我这个堆栈跟踪:

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;
        }
});

关于java - 无法将 OnLongClickListener 设置为 ExpandableListView 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45558219/

相关文章:

java - 如何从 Android 依赖项中排除 jar 文件?

java - 强制将 a 从父类型解析为子类型?

java - 通过 COM 端口上的蓝牙进行串行通信

android - Astuetz 的 PagerSlidingTabStrip 库还是不能滑动 tabStrip

android - 检索 Android Facebook 企业 token

android - 使用 notifyDataSetChanged() 更新 ExpandableListView

java - 如何通过 Jackson 的注释定义通用列表反序列化器?

java - 适用于 Android 的 SQLite 分组项目和可扩展 ListView

android - 可扩展 ListView ArrayIndexOutOfBoundsException

android - 可扩展 ListView Android 中的多个倒数计时器不起作用