Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用ActionModeBar时删除不在Recyclerview中工作的动画_Android_Android Layout_Android Recyclerview - Fatal编程技术网

Android 使用ActionModeBar时删除不在Recyclerview中工作的动画

Android 使用ActionModeBar时删除不在Recyclerview中工作的动画,android,android-layout,android-recyclerview,Android,Android Layout,Android Recyclerview,我正在recylcerview中选择多个项目,当我使用动作模式栏删除这些多个项目时,默认删除动画不显示,但当我删除单个项目时,动画播放? 这是我的主要活动 public class MainActivity extends AppCompatActivity implements android.view.ActionMode.Callback { public static boolean list_layout = true; SwipeRefreshLayout swipeRefresh

我正在recylcerview中选择多个项目,当我使用动作模式栏删除这些多个项目时,默认删除动画不显示,但当我删除单个项目时,动画播放? 这是我的主要活动

public class MainActivity extends AppCompatActivity implements android.view.ActionMode.Callback {

public static boolean list_layout = true;
SwipeRefreshLayout swipeRefreshLayout;
RecyclerView recyclerView;
ActionMode actionMode;
MyAdapter adapter;
private List<Person> persons;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    recyclerView = (RecyclerView) findViewById(R.id.rv);
    recyclerView.setHasFixedSize(false);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.addOnItemTouchListener(new RecyclerViewTouchListener(this, recyclerView, new ClickListener() {
        @Override
        public void onClick(View view, int position) {
            Toast.makeText(MainActivity.this, "onClick " + position, Toast.LENGTH_SHORT).show();
            if (actionMode != null) {
                myToggleSelection(position);
            }
            if (adapter.getSelectedItemCount() == 0 && actionMode != null) {
                actionMode.finish();
            }
        }

        @Override
        public void onLongClick(View view, int position) {
            Toast.makeText(MainActivity.this, "onLongClick " + position, Toast.LENGTH_SHORT).show();
            if (actionMode != null) {
                return;
            }
            actionMode = startActionMode(MainActivity.this);
            myToggleSelection(position);

        }
    }));

    initializeData();

    adapter = new MyAdapter(this, persons);
    recyclerView.setAdapter(adapter);

    swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.refreshSwipe);
    swipeRefreshLayout.setColorSchemeColors(Color.BLUE, Color.GREEN, Color.RED, Color.DKGRAY);
    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            swipeRefreshLayout.setRefreshing(false);
        }
    });
}

private void myToggleSelection(int idx) {
    adapter.toggleSelection(idx);
    String title = getString(R.string.selected_count, adapter.getSelectedItemCount());
    actionMode.setTitle(adapter.getSelectedItemCount() + " Selected");
}

private void initializeData() {
    persons = new ArrayList<>();
    for (int i = 0; i < 5; i++) {
        persons.add(new Person("Emma Wilson", "23 years old", R.mipmap.ic_launcher));
        persons.add(new Person("Lavery Maiss", "25 years old", R.mipmap.ic_launcher));
        persons.add(new Person("Lillie Watts", "35 years old", R.mipmap.ic_launcher));
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        if (list_layout) {
            list_layout = false;
            recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
            MyAdapter adapter = new MyAdapter(this, persons);
            recyclerView.setAdapter(adapter);
            item.setIcon(R.drawable.abc_ic_menu_copy_mtrl_am_alpha);
        } else {
            list_layout = true;
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            MyAdapter adapter = new MyAdapter(this, persons);
            recyclerView.setAdapter(adapter);
            item.setIcon(R.drawable.abc_ic_menu_selectall_mtrl_alpha);
        }

        return true;
    }

    return super.onOptionsItemSelected(item);
}


// Action Mode Methods
@Override
public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
    // Inflate a menu resource providing context menu items
    MenuInflater inflater = mode.getMenuInflater();
    inflater.inflate(R.menu.menu_cab_recyclerviewdemoactivity, menu);
    return true;
}

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

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

    switch (item.getItemId()) {
        case R.id.menu_delete:
            List<Integer> selectedItemPositions = adapter.getSelectedItems();
            for (int i = selectedItemPositions.size() - 1; i >= 0; i--) {
                adapter.remove(selectedItemPositions.get(i));
            }
            actionMode.finish();

            return true;
        default:
            return false;
    }
}

@Override
public void onDestroyActionMode(android.view.ActionMode mode) {
    this.actionMode = null;
    adapter.clearSelections();
}


// Interface
interface ClickListener {
    void onClick(View view, int position);

    void onLongClick(View view, int position);
}
public类MainActivity扩展AppCompatActivity实现android.view.ActionMode.Callback{
公共静态布尔列表_布局=true;
SwipeRefreshLayout SwipeRefreshLayout;
回收视图回收视图;
动作模式动作模式;
MyAdapter适配器;
私人名单人员;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView=(recyclerView)findViewById(R.id.rv);
recyclerView.setHasFixedSize(false);
recyclerView.setLayoutManager(新的LinearLayoutManager(本));
addOnItemTouchListener(新的RecyclerViewTouchListener(这个,recyclerView,新的ClickListener)(){
@凌驾
公共void onClick(视图,int位置){
Toast.makeText(MainActivity.this,“onClick”+位置,Toast.LENGTH\u SHORT.show();
if(actionMode!=null){
myToggleSelection(位置);
}
if(adapter.getSelectedItemCount()==0&&actionMode!=null){
actionMode.finish();
}
}
@凌驾
仅长按公共无效(视图,int位置){
Toast.makeText(MainActivity.this,“onLongClick”+位置,Toast.LENGTH\u SHORT.show();
if(actionMode!=null){
返回;
}
actionMode=startActionMode(MainActivity.this);
myToggleSelection(位置);
}
}));
初始化数据();
adapter=新的MyAdapter(此,人);
recyclerView.setAdapter(适配器);
swipeRefreshLayout=(swipeRefreshLayout)findViewById(R.id.refreshSwipe);
swipeRefreshLayout.setColorSchemeColors(Color.BLUE、Color.GREEN、Color.RED、Color.gray);
swipeRefreshLayout.setOnRefreshListener(新的swipeRefreshLayout.OnRefreshListener()){
@凌驾
公共void onRefresh(){
swipeRefreshLayout.setRefreshing(false);
}
});
}
私有无效myToggleSelection(int idx){
适配器。切换选择(idx);
String title=getString(R.String.selected_count,adapter.getSelectedItemCount());
actionMode.setTitle(adapter.getSelectedItemCount()+“Selected”);
}
private void initializeData(){
persons=newarraylist();
对于(int i=0;i<5;i++){
添加(新人物(“Emma Wilson”,“23岁”,R.mipmap.ic_launcher));
添加(新人物(“Lavery Maiss”,“25岁”,R.mipmap.ic_launcher));
添加(新人物(“莉莉·瓦茨”,“35岁”,R.mipmap.ic_launcher));
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(右菜单菜单菜单主菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
//noinspection SimplifiableIf语句
if(id==R.id.action\u设置){
if(列表和布局){
列表布局=假;
setLayoutManager(新的GridLayoutManager(this,2));
MyAdapter=新的MyAdapter(此,个人);
recyclerView.setAdapter(适配器);
项目设置图标(R.drawable.abc\U ic\U菜单\U复制\U mtrl\U am\U alpha);
}否则{
列表布局=真;
recyclerView.setLayoutManager(新的LinearLayoutManager(本));
MyAdapter=新的MyAdapter(此,个人);
recyclerView.setAdapter(适配器);
设置图标(R.drawable.abc\u ic\u菜单\u selectall\u mtrl\u alpha);
}
返回true;
}
返回super.onOptionsItemSelected(项目);
}
//动作模式方法
@凌驾
公共布尔onCreateActionMode(android.view.ActionMode模式,菜单){
//为提供上下文菜单项的菜单资源充气
MenuInflater充气器=模式。getMenuInflater();
充气机。充气(R.menu.menu\u cab\u RecycleServiceEWDEMOVICE,菜单);
返回true;
}
@凌驾
公共布尔onPrepareActionMode(android.view.ActionMode模式,菜单){
返回false;
}
@凌驾
已单击的公共布尔OnActionItem(android.view.ActionMode模式,菜单项){
开关(item.getItemId()){
案例R.id.菜单\u删除:
List selectedItemPositions=adapter.getSelectedItems();
对于(int i=selectedItemPositions.size()-1;i>=0;i--){
移除(selectedItemPositions.get(i));
}
actionMode.finish();
返回true;
违约:
返回false;
}
}
@凌驾
public void onDestroyActionMode(android.view.ActionMode){
this.actionMode=null;
adapter.clears();
}
//接口
界面ClickListener{
void onClick(视图,int位置);
仅长按无效(视图,int位置);
}
}

这是我的适配器类

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

List<Person> persons;
LayoutInflater inflater;
Context context;
private int previousPosition = 0;
private boolean deleting = false;
private boolean isGridLayout = false;
private boolean isOddCard = true;
private SparseBooleanArray selectedItems = new SparseBooleanArray();
private SparseBooleanArray mSelectedPositions = new SparseBooleanArray();
private boolean mIsSelectable = false;
private boolean selecting = false;

public MyAdapter(Context context, List<Person> persons) {
    this.persons = persons;
    this.context = context;
    inflater = LayoutInflater.from(context);
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    int resource = R.layout.cardview_list_item;
    if (!MainActivity.list_layout) {
        resource = R.layout.cardview_grid_item;
        isGridLayout = true;
    } else {
        isGridLayout = false;
    }
    View view = inflater.inflate(resource, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    Person person = persons.get(position);
    holder.personName.setText(person.name);
    holder.personAge.setText(person.age);
    holder.personPhoto.setImageResource(person.photoId);
    holder.itemView.setActivated(selectedItems.get(position, false));
    holder.overflowMenu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showPopMenu((ImageButton) v, holder);
        }
    });
}

private void showPopMenu(ImageButton button, final ViewHolder holder) {
    PopupMenu popup = new PopupMenu(context, button);
    //Inflating the Popup using xml file
    popup.getMenuInflater()
            .inflate(R.menu.menu_card, popup.getMenu());

    //registering popup with OnMenuItemClickListener
    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        public boolean onMenuItemClick(MenuItem item) {
            Toast.makeText(context, "You Clicked : " + item.getTitle(), Toast.LENGTH_SHORT).show();
            deleting = true;
            int position = holder.getPosition();
            remove(position);
            return true;
        }
    });

    popup.show();
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

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

public void toggleSelection(int pos) {
    if (selectedItems.get(pos, false)) {
        selectedItems.delete(pos);
    } else {
        selectedItems.put(pos, true);
    }
    selecting = true;
    notifyItemChanged(pos);
}


public void clearSelections() {
    selectedItems.clear();
    notifyDataSetChanged();
    selecting = false;
}

public int getSelectedItemCount() {
    return selectedItems.size();
}

public List<Integer> getSelectedItems() {
    List<Integer> items =
            new ArrayList<Integer>(selectedItems.size());
    for (int i = 0; i < selectedItems.size(); i++) {
        items.add(selectedItems.keyAt(i));
    }
    return items;
}

public void remove(int position) {
    persons.remove(position);
    deleting = true;
    notifyItemRemoved(position);
}

public class ViewHolder extends RecyclerView.ViewHolder {

    CardView cv;
    ImageButton overflowMenu;
    TextView personName;
    TextView personAge;
    ImageView personPhoto;
    View itemView;


    public ViewHolder(View itemView) {
        super(itemView);
        this.itemView = itemView;
        cv = (CardView) itemView.findViewById(R.id.cardView);
        overflowMenu = (ImageButton) itemView.findViewById(R.id.imageButton);
        personName = (TextView) itemView.findViewById(R.id.person_name);
        personAge = (TextView) itemView.findViewById(R.id.person_age);
        personPhoto = (ImageView) itemView.findViewById(R.id.person_photo);
    }
}
公共类MyAdapter扩展了RecyclerView.Adapter{ 列出人员名单; 充气机; 语境; private int previousPosition=0; 私有布尔删除=false; 私有布尔值isGridLayout=false; 私有布尔值isOddCard=true; 专用SparseBooleanArray selectedItems=新SparseBooleanArray(); 专用SparseBooleanArray mSelectedPositions=新SparseBooleanArray(); 私有布尔值mIsSelectable=false; 私有布尔选择=false; 公共MyAdapter(上下文,列出人员){ 这个人=人; this.context=上下文; 充气器=充气器。从(上下文)