OnDestroyActionMode()中断了onActionItemClicked()

萨瓦

我有一个名为delete的操作项,该操作项获取我创建的ArrayList并删除所有已检查的Contact(基于我在Contact类中具有的布尔变量)。

当我单击删除时,一切都很好,这是一项,但是,如果项超过6个,onDestroyActionMode方法会中断我的onActionItemClicked方法,并且某些项不会被删除。我该如何解决?

这是我的代码:

import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;

public class ContactViewAdapter extends RecyclerView.Adapter<ContactViewAdapter.ContactViewHolder> {

private static final String TAG = "AKS";

private AppCompatActivity mActivity;
private List<Contact> contactList;
public ActionMode mActionMode = null;
public ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.action_mode_menu, menu);
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {

        switch (item.getItemId()) {
            case R.id.action_mode_delete:
                for (int i = 0; i < contactList.size(); i++) {
                    Log.d(TAG, "size " + String.valueOf(contactList.size()));
                    if (contactList.get(i).isSelected) {
                        contactList.remove(i);
                    }
                }
                notifyDataSetChanged();

                mode.finish();
                return true;
            default:
                return false;
        }
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
        for (Contact c : contactList) {
            c.isSelected = false;
            Log.d(TAG, "onDestroyActionMode");
        }
        mActionMode.finish();
        mActionMode = null;
        notifyDataSetChanged();
    }
};

public class ContactViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {

    public TextView contactName;
    public TextView contactMoneyOwed;
    public ImageView contactPhoto;
    public CheckBox isCheckedBox;

    public ContactViewHolder(View v) {
        super(v);
        contactName = (TextView) itemView.findViewById(R.id.contact_name);
        contactMoneyOwed = (TextView) itemView.findViewById(R.id.contact_money_owed);
        contactPhoto = (ImageView) itemView.findViewById(R.id.contact_photo);
        isCheckedBox = (CheckBox) itemView.findViewById(R.id.listItemCheckBox);
        v.setOnClickListener(this);
        v.setOnLongClickListener(this);
    }

    @Override
    public void onClick(View v) {
        boolean everythingIsUnchecked = true;
        for (Contact c : contactList) {
            if (c.isSelected) {
                everythingIsUnchecked = false;
            }
        }
        if (!everythingIsUnchecked) {
            isCheckedBox.setChecked(!isCheckedBox.isChecked());
        } else {
            Toast.makeText(mActivity.getApplicationContext(), "Coming soon!", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public boolean onLongClick(View v) {
        isCheckedBox.setChecked(true);
        return true;
    }
}

public ContactViewAdapter(List<Contact> contactList, AppCompatActivity activity) {
    this.contactList = contactList;
    this.mActivity = activity;
}

@Override
public ContactViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
    return new ContactViewHolder(v);
}

@Override
public void onBindViewHolder(final ContactViewHolder contactViewHolder, final int position) {
    contactViewHolder.contactName.setText(contactList.get(position).name);
    contactViewHolder.contactMoneyOwed.setText(contactList.get(position).moneyOwed);
    contactViewHolder.contactPhoto.setImageResource(contactList.get(position).photoID);
    contactViewHolder.contactPhoto.setOnTouchListener(null);
    contactViewHolder.contactPhoto.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                contactViewHolder.isCheckedBox.setChecked(true);
            }
            return true;
        }
    });
    contactViewHolder.isCheckedBox.setOnCheckedChangeListener(null);
    contactViewHolder.isCheckedBox.setChecked(contactList.get(position).isSelected);

    if (contactViewHolder.isCheckedBox.isChecked()) {
        contactViewHolder.contactPhoto.setVisibility(View.GONE);
        contactViewHolder.isCheckedBox.setVisibility(View.VISIBLE);
    } else {
        contactViewHolder.isCheckedBox.setVisibility(View.GONE);
        contactViewHolder.contactPhoto.setVisibility(View.VISIBLE);
    }

    contactViewHolder.isCheckedBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            Log.d(TAG, String.valueOf(position));
            contactList.get(position).isSelected = isChecked;
            boolean everythingIsUnchecked = true;
            for (Contact c : contactList) {
                if (c.isSelected) {
                    everythingIsUnchecked = false;
                }
            }
            if (mActionMode == null) {
                mActionMode = mActivity.startActionMode(mActionModeCallback);
            } else if (everythingIsUnchecked) {
                mActionMode.finish();
                mActionMode = null;
            }
            if (isChecked) {
                contactViewHolder.contactPhoto.setVisibility(View.GONE);
                contactViewHolder.isCheckedBox.setVisibility(View.VISIBLE);
            } else {
                contactViewHolder.isCheckedBox.setVisibility(View.GONE);
                contactViewHolder.contactPhoto.setVisibility(View.VISIBLE);
            }
        }
    });
}

@Override
public int getItemCount() {
    return contactList.size();
    }

}

这是我从日志中得到的:

10-03 19:47:23.181 1962-1962/com.example.andreassavva.expensemanager D/AKS: 0
10-03 19:47:23.413 1962-1962/com.example.andreassavva.expensemanager D/AKS: 1
10-03 19:47:23.789 1962-1962/com.example.andreassavva.expensemanager D/AKS: 2
10-03 19:47:24.067 1962-1962/com.example.andreassavva.expensemanager D/AKS: 3
10-03 19:47:24.453 1962-1962/com.example.andreassavva.expensemanager D/AKS: 4
10-03 19:47:25.115 1962-1962/com.example.andreassavva.expensemanager D/AKS: 5
10-03 19:47:26.350 1962-1962/com.example.andreassavva.expensemanager D/AKS: 6
10-03 19:47:26.734 1962-1962/com.example.andreassavva.expensemanager D/AKS: 7
10-03 19:47:27.046 1962-1962/com.example.andreassavva.expensemanager D/AKS: 8
10-03 19:47:27.468 1962-1962/com.example.andreassavva.expensemanager D/AKS: 9
10-03 19:47:27.812 1962-1962/com.example.andreassavva.expensemanager D/AKS: 10
10-03 19:47:29.658 1962-1962/com.example.andreassavva.expensemanager D/AKS: size 11
10-03 19:47:29.658 1962-1962/com.example.andreassavva.expensemanager D/AKS: size 10
10-03 19:47:29.658 1962-1962/com.example.andreassavva.expensemanager D/AKS: size 9
10-03 19:47:29.658 1962-1962/com.example.andreassavva.expensemanager D/AKS: size 8
10-03 19:47:29.658 1962-1962/com.example.andreassavva.expensemanager D/AKS: size 7
10-03 19:47:29.658 1962-1962/com.example.andreassavva.expensemanager D/AKS: size 6
10-03 19:47:29.659 1962-1962/com.example.andreassavva.expensemanager D/AKS: onDestroyActionMode
10-03 19:47:29.659 1962-1962/com.example.andreassavva.expensemanager D/AKS: onDestroyActionMode
10-03 19:47:29.659 1962-1962/com.example.andreassavva.expensemanager D/AKS: onDestroyActionMode
10-03 19:47:29.659 1962-1962/com.example.andreassavva.expensemanager D/AKS: onDestroyActionMode
10-03 19:47:29.659 1962-1962/com.example.andreassavva.expensemanager D/AKS: onDestroyActionMode
萨瓦

弄清楚了。我的循环糟透了。我需要将其更改为

for (int i = contactList.size() - 1; i >= 0; i--) {
                        if (contactList.get(i).isSelected()) {
                            contactList.remove(i);
                        }
                    }

反而。谢谢您的帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Blobstore:服务中断了吗?

来自分类Dev

留言中断了吗?

来自分类Dev

pytest中断了pip安装

来自分类Dev

Blobstore:服务中断了吗?

来自分类Dev

我的功能中断了网站

来自分类Dev

grep中断了systemctl的格式

来自分类Dev

Oracle 11计划作业中断了吗?

来自分类Dev

IEquatable中断了Entity Framework实体的加载

来自分类Dev

Ubuntu升级,Perl版本中断了ZImbra

来自分类Dev

Ubuntu升级,Perl版本中断了ZImbra

来自分类Dev

ML代理-多个代理中断了培训

来自分类Dev

Ubuntu升级,Perl版本中断了ZImbra

来自分类Dev

Windows 10更新中断了Gummiboot

来自分类Dev

gVIM中断了Windows上的符号链接?

来自分类Dev

Debian Wheezy更新中断了tr命令

来自分类Dev

超时命令中断了需要输入的命令

来自分类Dev

重建索引任务中断了存储过程的编译

来自分类Dev

窗口更新中断了MVC应用程序

来自分类Dev

iptables规则中断了Docker容器之间的通信

来自分类Dev

resteasy-cdi中断了对Tomcat 7的部署

来自分类Dev

maven-javadoc-plugin中断了mvn版本:perform

来自分类Dev

静态IP设置中断了互联网连接

来自分类Dev

从Apache转向Tomcat中断了Grails其余api调用

来自分类Dev

转到Spring 4之后,我的自动装配中断了

来自分类Dev

C ++ O3优化中断了while循环的工作

来自分类Dev

<a>链接中断了Safari中的SVG路径转换

来自分类Dev

中断了MongoDB模式版本3,但发现1

来自分类Dev

Nuget System.Data.SqlClient中断了我的项目

来自分类Dev

中间件中断了Web API调用