Android Open Source - SwipeListView Swipe To Delete Adapter






From Project

Back to project page SwipeListView.

License

The source code is released under:

Apache License

If you think the Android project SwipeListView listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/**
 * Copyright 2013 Yoann Delouis/*from   ww w . j av  a2  s  .  c o m*/
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package fr.ydelouis.widget;

import android.database.DataSetObserver;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ListAdapter;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class SwipeToDeleteAdapter
    extends BaseAdapter {
  private SwipeToDeleteListView listView;
  private ListAdapter adapter;
  private SparseArray<ItemState> itemStates = new SparseArray<ItemState>();

  public SwipeToDeleteAdapter(SwipeToDeleteListView listView, ListAdapter adapter) {
    this.listView = listView;
    this.adapter = adapter;
    this.adapter.registerDataSetObserver(new DataSetObserver() {
      public void onChanged() {
        notifyDataSetChanged();
      }

      public void onInvalidated() {
        notifyDataSetInvalidated();
      }
    });
  }

  public ListAdapter getAdapter() {
    return adapter;
  }

  @Override
  public View getView(int position, View view, ViewGroup parent) {
    ItemState itemState = getItemState(position);
    switch (itemState.getState()) {
      case DeletionConfirmed:
        return getDeletionConfirmedView(position, view, parent, itemState);
      case Deleted:
        return getDeletedView(position, view, parent, itemState);
      default:
        return getNormalView(position, view, parent, itemState);
    }
  }

  public ItemState getItemState(int position) {
    if (position < 0)
      return null;
    ItemState itemState = itemStates.get(position);
    if (itemState == null) {
      itemState = new ItemState(position);
      itemStates.put(position, itemState);
    }
    return itemState;
  }

  private View getDeletionConfirmedView(int position, View view, ViewGroup parent, ItemState itemState) {
    if (view == null) {
      if (listView.isConfirmNeeded())
        view = getNormalView(position, view, parent, itemState);
      else
        view = new View(listView.getContext());
    }
    setViewHeight(view, itemState);
    return view;
  }

  private View getDeletedView(int position, View view, ViewGroup parent, ItemState itemState) {
    view = listView.getDeletedViewAdapter().getView(position, view, parent);
    setViewHeight(view, itemState);
    return view;
  }

  private View getNormalView(int position, View view, ViewGroup parent, ItemState itemState) {
    view = adapter.getView(position, view, parent);
    itemState.setInitialViewHeight(view.getHeight());
    view.setTag(listView.getId(), itemState);
    return view;
  }

  private void setViewHeight(View view, ItemState itemState) {
    ViewGroup.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0);
    lp.height = itemState.getHeight();
    view.setLayoutParams(lp);
  }

  public void onItemDeletionConfirmed(ItemState itemState) {
    int position = itemState.getPosition();
    itemStates.remove(position);
    List<Integer> greaterPositions = new ArrayList<Integer>();
    for (int index = 0; index < itemStates.size(); index++) {
      int key = itemStates.keyAt(index);
      if (key > position)
        greaterPositions.add(key);
    }
    Collections.sort(greaterPositions);
    for (Integer key : greaterPositions) {
      ItemState iState = itemStates.get(key);
      itemStates.remove(key);
      iState.setPosition(iState.getPosition() - 1);
      itemStates.put(iState.getPosition(), iState);
    }
  }

  @Override
  public int getItemViewType(int position) {
    ItemState itemState = getItemState(position);
    switch (itemState.getState()) {
      case DeletionConfirmed:
        if (listView.isConfirmNeeded())
          return 1;
        else
          return 2;
      case Deleted:
        return 1;
      default:
        return 0;
    }
  }

  @Override
  public int getViewTypeCount() {
    return 3;
  }

  @Override
  public int getCount() {
    return adapter.getCount();
  }

  @Override
  public Object getItem(int position) {
    return adapter.getItem(position);
  }

  @Override
  public long getItemId(int position) {
    return adapter.getItemId(position);
  }

  public List<Integer> getDeleted() {
    List<Integer> deleted = new ArrayList<Integer>();
    for (int i = 0; i < itemStates.size(); i++) {
      ItemState itemState = itemStates.valueAt(i);
      if (itemState.getState() == ItemState.State.Deleted)
        deleted.add(itemState.getPosition());
    }
    return deleted;
  }
}




Java Source Code List

fr.ydelouis.swipelistviewsample.MainActivity.java
fr.ydelouis.swipelistviewsample.MyDeletedViewAdapter.java
fr.ydelouis.swipelistviewsample.MyItemAdapter.java
fr.ydelouis.swipelistviewsample.MyItemModel.java
fr.ydelouis.swipelistviewsample.MyItemView.java
fr.ydelouis.swipelistviewsample.MyItem.java
fr.ydelouis.swipelistviewsample.WithConfirmActivity.java
fr.ydelouis.swipelistviewsample.WithoutConfirmActivity.java
fr.ydelouis.widget.BackAnimation.java
fr.ydelouis.widget.DeleteAnimation.java
fr.ydelouis.widget.DeletionConfirmedAnimation.java
fr.ydelouis.widget.ItemState.java
fr.ydelouis.widget.SwipeToDeleteAdapter.java
fr.ydelouis.widget.SwipeToDeleteListView.java