实现 OnLongClickListener 时 ExpandableListView 不展开

ExpandableListView not expanding when OnLongClickListener is implemented

我有一个 ExpandableListView,我希望其中的项目是可编辑的。所以我在用户 'longClicks' 上显示 "edit dialog" 一个项目。但是在我为该组的 convertView 实现 onLongClickListener 之后,它不再在单击时展开。如果我注释掉我设置 onLongClickListener 的代码,该组将按预期展开。如何阻止 LongClickListner 从组的 convertView 窃取点击事件?

其他人似乎也有这个问题,接受的答案是 LongClickListener 中的 return false,但这对我不起作用。

这是我获取 groupView 并设置 LongClickListener 的地方:

...
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
                         View convertView, ViewGroup parent) {
    final Crew crew = (Crew) getGroup(groupPosition);
    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this.context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.crew_item_row, null);
    }

    TextView lblListHeader = (TextView) convertView
            .findViewById(R.id.crewTxtView);
    lblListHeader.setTypeface(null, Typeface.BOLD);
    lblListHeader.setText(crew.getName());

    //set ya onlclick listener here too for ya button to add crew member
    RelativeLayout addMemberBttn = (RelativeLayout) convertView.findViewById(R.id.addCrewMemberBttn);
    addMemberBttn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showNewMemberDialog(crew.getId());
        }
    });

    convertView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            showEditCrewDialog(crew);
            return false;
        }
    });

    return convertView;
}

对话框方法代码:

private void showEditCrewDialog(final Crew crew){
    final Dialog dialog = new Dialog(context);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setCancelable(false);
    dialog.setContentView(R.layout.edit_crew_dialog);

    final EditText crewTextBox = (EditText) dialog.findViewById(R.id.crewEditTxt);
    crewTextBox.setText(crew.getName());
    final ImageView editButton = (ImageView) dialog.findViewById(R.id.editCrewBttn);
    editButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            crewTextBox.setEnabled(true);
            crewTextBox.setBackgroundResource(R.drawable.textbox);
            editButton.setVisibility(View.GONE);
        }
    });

    Button cancelBttn = (Button) dialog.findViewById(R.id.crewCancelBttn);
    cancelBttn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialog.dismiss();
        }
    });

    Button updateBttn = (Button) dialog.findViewById(R.id.updateCrewDialogBttn);
    updateBttn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(!crewTextBox.isEnabled()) {
                dialog.dismiss();
                return;
            }
            String crewName = crewTextBox.getText().toString();
            if(crewName.isEmpty()){
                Toast.makeText(context, "Crew must have a name...", Toast.LENGTH_SHORT).show();
                return;
            }

            crew.setName(crewName);
            CrewService crewService = new CrewService(context);
            if(crewService.updateCrew(crew)==0){
                Toast.makeText(context, "Error updating crew...", Toast.LENGTH_SHORT).show();
                return;
            };

            notifyDataSetChanged();
            Toast.makeText(context, "Crew updated!", Toast.LENGTH_SHORT).show();
            dialog.dismiss();
        }
    });

    dialog.show();
}

将 OnChildClickListener 用于可扩展列表视图

您应该从 activity 中调用 setOnItemLongListener 而不是在 getGroupView 中。在定义了可扩展列表视图的 activity 中使用以下代码。

expandableListView.setOnItemLongClickListener(new OnItemLongClickListener() {

        Override   
        public boolean onItemLongClick( AdapterView<?> parent, View view, int position, long id) {
            showEditCrewDialog(crew);
            return false;
        }
    });