mercredi 13 mai 2015

Delete Animation not Working in Recyclerview When using ActionModeBar

I am selecting multiple items in my recylcerview and when i delete these multiple items using Action mode bar then default delete animation is not showing but when i am deleting item single then animation plays? This is my MainActivity.

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

}

This my Adapter class.

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

private void animate(RecyclerView.ViewHolder holder, boolean goesDown) {
    ObjectAnimator animator = ObjectAnimator.ofFloat(holder.itemView, "translationY", goesDown ? 100 : -100, 0);
    if (isGridLayout) {
        if (isOddCard) {
            animator = ObjectAnimator.ofFloat(holder.itemView, "translationY", goesDown ? 100 : -100, 0);
            isOddCard = false;
        } else {
            animator = ObjectAnimator.ofFloat(holder.itemView, "translationY", goesDown ? 150 : -150, 0);
            isOddCard = true;
        }
    }
    animator.setDuration(800);
    animator.start();
}

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

}

Aucun commentaire:

Enregistrer un commentaire