【问题标题】:android expandlistview delete itemsandroid expandlistview 删除项目
【发布时间】:2015-06-09 08:00:00
【问题描述】:

问题描述:

当我单击组时,它会展开并显示 childView,然后单击 childView 中的“删除”按钮,它会弹出一个 AlertDialog,单击“确认”按钮后,当前项目将从列表中删除,但我目前的代码无法达到这个效果。有人有什么想法吗?

这是我的代码:

public class ManageFragment extends FragmentBase{

private ExpandableListView mExpandableListView;
private ExpandListAdapter mAdapter;
private List<String> mGroups;
private HashMap<String, List<String>> mChilds;
private Button openBtn;
private TextView download_history;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_manage, container, false);
    prepareData();
    init(view);
    return view;
}
private void init(View view) {
    mAdapter = new ExpandListAdapter(getActivity(), mGroups, mChilds);
    mExpandableListView = (ExpandableListView) view.findViewById(R.id.expand_listview);
    download_history = (TextView) view.findViewById(R.id.download_history);

    int number = mGroups.size();
    download_history.setText(String.valueOf(number));


    mExpandableListView.setAdapter(mAdapter);


    mExpandableListView.setOnGroupExpandListener(new OnGroupExpandListener() {

        @Override
        public void onGroupExpand(int groupPosition) {
            for(int i = 0; i < mAdapter.getGroupCount(); i++){
                if(groupPosition != i){
                    mExpandableListView.collapseGroup(i);
                }
            }

        }
    });



@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

private void prepareData() {
    mGroups = new ArrayList<String>();
    mChilds = new HashMap<String, List<String>>();

    mGroups.add("Group 1");
    mGroups.add("Group 2");
    mGroups.add("Group 2");
    mGroups.add("Group 2");
    mGroups.add("Group 2");
    mGroups.add("Group 2");
    mGroups.add("Group 2");

    List<String> menu = new ArrayList<String>();
    menu.add("menu 1"); 

    mChilds.put(mGroups.get(0), menu);
    mChilds.put(mGroups.get(1), menu);
}

}

 public class ExpandListAdapter extends BaseExpandableListAdapter implements OnClickListener{

private Context mContext;
private List<String> mGroups;
private HashMap<String, List<String>> mChilds;
private boolean flag = true;    
private TextView delete_local,delete_confirm,delete_cancel;
AlertDialog dialog;

public ExpandListAdapter(Context context, List<String> groups,
        HashMap<String, List<String>> childs) {
    mContext = context;
    mGroups = groups;
    mChilds = childs;
}

/**
 * get size list group
 */
@Override
public int getGroupCount() {
    return mGroups.size();
}

/**
 * get size current list child
 */
@Override
public int getChildrenCount(int groupPosition) {
    return mChilds.get(mGroups.get(groupPosition)).size();
}

/**
 * get object group
 */
@Override
public Object getGroup(int groupPosition) {
    return mGroups.get(groupPosition);
}

/**
 * get object child
 */
@Override
public Object getChild(int groupPosition, int childPosition) {
    return mChilds.get(mGroups.get(groupPosition)).get(childPosition);
}

/**
 * get current group id
 */
@Override
public long getGroupId(int groupPosition) {
    return groupPosition;
}

/**
 * get current child id
 */
@Override
public long getChildId(int groupPosition, int childPosition) {
    return childPosition;
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent) {
    //String groupText = (String) getGroup(groupPosition);
    ViewHolder holder = null;

    if (convertView == null) {
        holder = new ViewHolder();
        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.group_layout, null);
        holder.expand_imgView = (ImageView) convertView.findViewById(R.id.expand_list_image);
        holder.rank_download = (Button) convertView.findViewById(R.id.rank_download);
        convertView.setTag(holder);
    }else{
        holder = (ViewHolder) convertView.getTag();
    }

    holder.rank_download.setOnClickListener(this);

    if(isExpanded){
        holder.expand_imgView.setBackgroundResource(R.drawable.manage_collapse);
    }else{
        holder.expand_imgView.setBackgroundResource(R.drawable.manage_expand);
    }

    return convertView;
}

class ViewHolder{
    ImageView expand_imgView;
    Button manage_share,manage_redownload,manage_delete,rank_download;
}

@Override
public View getChildView(int groupPosition, int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) {
    //String childText = (String) getChild(groupPosition, childPosition);
    ViewHolder holder = null;
    if (convertView == null) {
        holder = new ViewHolder();
        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.child_layout, null);

        holder.manage_share = (Button) convertView.findViewById(R.id.manage_share);
        holder.manage_redownload = (Button) convertView.findViewById(R.id.manage_redownload);
        holder.manage_delete = (Button) convertView.findViewById(R.id.manage_clean);

        convertView.setTag(holder);
    }else{
        holder = (ViewHolder) convertView.getTag();
    }

    holder.manage_share.setOnClickListener(this);
    holder.manage_redownload.setOnClickListener(this);
    holder.manage_delete.setOnClickListener(this);
    holder.manage_delete.setTag(groupPosition);


    return convertView;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return true;
}

@Override
public void onClick(View v) {
    int id = v.getId();
    switch (id) {
    case R.id.manage_share:
        Toast.makeText(mContext, "share", 3).show();
        break;

    case R.id.manage_redownload:
        Toast.makeText(mContext, "redownload", 3).show();
        break;

    case R.id.manage_clean:
        showDeleteDialog();
        break;

    case R.id.rank_download:
        Toast.makeText(mContext, "open", 3).show();
        break;

    case R.id.delete_local:
        if (flag == false) {
            delete_local.setCompoundDrawablesWithIntrinsicBounds(          
                    R.drawable.checkbox_pressed, 0, 0, 0);  
            flag = true;
        }else if(flag==true){
            delete_local.setCompoundDrawablesWithIntrinsicBounds(R.drawable.checkbox,0,0, 0);
            flag=false;
        }
        break;

    case R.id.delete_confirm:
        Object tag = v.getTag();
        System.out.println("tag------------>" + tag);
        if(null != tag){
            mGroups.remove((Integer)tag);
            mChilds.remove((Integer)tag);
            dialog.dismiss();
            this.notifyDataSetChanged();
        }else{
            dialog.dismiss();

        }
        break;
    case R.id.delete_cancel:
        dialog.dismiss();
        break;
    default:
        break;
    }
}

private void showDeleteDialog() {
    dialog = new AlertDialog.Builder(mContext).create();
    View view = LayoutInflater.from(mContext).inflate(R.layout.dialog_delete, null);
    delete_local = (TextView) view.findViewById(R.id.delete_local);
    delete_confirm = (TextView) view.findViewById(R.id.delete_confirm);
    delete_cancel = (TextView) view.findViewById(R.id.delete_cancel);
    delete_local.setOnClickListener(this);
    delete_confirm.setOnClickListener(this);
    delete_cancel.setOnClickListener(this);

    view.setMinimumWidth((int) (((Activity) mContext).getWindowManager()  
            .getDefaultDisplay().getWidth() * 0.8));
    dialog.setView(view);
    dialog.setInverseBackgroundForced(true);

    dialog.show();
}

}

【问题讨论】:

    标签: android items


    【解决方案1】:

    我认为你的问题在这里

     case R.id.delete_confirm:
        Object tag = v.getTag();
    

    您没有在此代码中的任何位置将标签设置为 delete_confirm。您将其设置为 manage_delete。所以我会像这样将位置传递给你的 showDeleteDialog 方法

     case R.id.manage_clean:
        int pos = (int)v.getTag();
        showDeleteDialog(pos);
        break;
    

    然后在你的 showDeleteDialog 方法中将 pos 设置为 delete_confirm 的标签

    private void showDeleteDialog(int pos) {
        dialog = new AlertDialog.Builder(mContext).create();
        View view = LayoutInflater.from(mContext).inflate(R.layout.dialog_delete, null);
        delete_local = (TextView) view.findViewById(R.id.delete_local);
        delete_confirm = (TextView) view.findViewById(R.id.delete_confirm);
        delete_cancel = (TextView) view.findViewById(R.id.delete_cancel);
        delete_local.setOnClickListener(this);
        delete_confirm.setOnClickListener(this);
        delete_cancel.setOnClickListener(this);
    
        delete_confirm.setTag(pos);
    
        view.setMinimumWidth((int) (((Activity) mContext).getWindowManager()  
            .getDefaultDisplay().getWidth() * 0.8));
        dialog.setView(view);
        dialog.setInverseBackgroundForced(true);
    
        dialog.show();
    }
    

    【讨论】:

    • 谢谢!现在当我点击对话框中的确认按钮时它可以获得位置,但它仍然没有从列表中删除该项目,我该怎么办?
    • 我对你的代码有点困惑。您只向您的 mChilds 添加了 2 个值,我不明白您为什么使用哈希图。当然最好只使用这个答案中的数据结构stackoverflow.com/questions/4366132/…
    • 我是android初学者,部分代码是别人的参考,delete事件应该放在adapter还是ManageFragment中,谢谢!
    • 你能告诉我更多关于代码的信息吗?就像您记录了此代码一样?你知道它失败的地方吗?甚至会调用 onClick 事件吗?
    • 再次感谢您!代码的意图是,当我单击组时,它会展开并显示子视图,子视图中有一个删除按钮,当单击该按钮时,会弹出一个警告对话框,当您单击确认按钮时,当前组项应该被删除,是的,适配器中的 onClick 事件都被执行,但除了这些代码:mGroups.remove((Integer)tag); mChilds.remove((Integer)tag); this.notifyDataSetChanged();
    猜你喜欢
    • 2012-06-22
    • 1970-01-01
    • 2011-02-03
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多