ListView 批量删除、数据库同步

来源:互联网 发布:mysql语句sql union 编辑:程序博客网 时间:2024/06/14 12:07

ListView批量删除的动画实现和数据库同步

参考:凯子哥blog

需要两个jar包

com.haarman.listviewanimations-2.5.1.jar
nieoldandroids-2.4.0.jar

效果图

效果图

实现代码

  • 布局文件list_view_item.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"              android:orientation="vertical"              android:layout_width="match_parent"              android:layout_height="match_parent">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="63dp"        android:orientation="vertical">        <LinearLayout            android:layout_width="match_parent"            android:layout_height="2dp"            android:background="#11000000"/>        <LinearLayout            android:id="@+id/llLayout"            android:layout_width="match_parent"            android:layout_height="60dp"            android:orientation="horizontal">            <CheckBox                android:id="@+id/chb"                android:layout_marginLeft="10dp"                android:layout_gravity="center"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:visibility="invisible"                android:clickable="false"                android:focusable="false"                android:focusableInTouchMode="false"/>            <ImageView                android:id="@+id/ivContact"                android:layout_marginLeft="3dp"                android:layout_width="56dp"                android:layout_height="56dp"                android:src="@drawable/ic_account_circle_black_24dp"/>            <TextView                android:id="@+id/tvName"                android:layout_width="60dp"                android:layout_height="46dp"                android:text="Mike"                android:gravity="center"                android:layout_gravity="center"                android:textSize="18dp"/>            <TextView                android:id="@+id/tvPhone"                android:layout_gravity="center"                android:layout_width="wrap_content"                android:layout_height="46dp"                android:text="1565937591"                android:gravity="center"                android:textSize="26dp"/>        </LinearLayout>    </LinearLayout></LinearLayout>
  • 布局文件activity_list_view.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.studio.wythe.wind.listView">    <ListView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/lvList"/></RelativeLayout>
  • 数据库文件DatabaseManager.java
package com.studio.wythe.wind;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import com.amap.api.maps.model.LatLng;/** * Created by admin on 2016/1/27. */public class DatabaseManager extends SQLiteOpenHelper{    public static final int DATABASE_VERSION = 1;    public static final String DATABASE_NAME = "DATABASE";    public static final String LATLNG_TABLE = "LATLNG";    public static final String LATLNG_LATITUDE = "LATITUDE";//纬度    public static final String LATLNG_LONGTITUDE = "LONGTITUDE";//经度    public static final String LATLNG_ID = "ID";    public static final String CONTACT_TABLE = "CONTACT";    public static final String CONTACT_PHONE_NUM = "PHOMENUM";    public static final String CONTACT_NAME = "NAME";    public static final String CONTACT_ID = "ID";    public static SQLiteDatabase sqlDB;    public DatabaseManager(Context context){        super(context,DATABASE_NAME,null,DATABASE_VERSION);    }    @Override    public void onCreate(SQLiteDatabase sqlDB) {        String CREATE_LATLNG_TABLE = "CREATE TABLE "+LATLNG_TABLE+"("                +LATLNG_ID+" INTEGER PRIMARY KEY AUTOINCREMENT"+","                +LATLNG_LATITUDE+" INTEGER"+","                +LATLNG_LONGTITUDE+" INTEGER"+")";        sqlDB.execSQL(CREATE_LATLNG_TABLE);        String CREATE_CONTACT_TABLE = "CREATE TABLE "+CONTACT_TABLE+"("                +CONTACT_ID+" INTEGER PRIMARY KEY AUTOINCREMENT"+","                +CONTACT_NAME+" TEXT"+","                +CONTACT_PHONE_NUM+" TEXT"+")";        sqlDB.execSQL(CREATE_CONTACT_TABLE);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }    public void insertRow (LatLng latLng){        this.sqlDB = this.getWritableDatabase();        ContentValues values = new ContentValues();        values.put(LATLNG_LATITUDE,latLng.latitude);        values.put(LATLNG_LONGTITUDE,latLng.longitude);        this.sqlDB.insert(LATLNG_TABLE, null, values);        closeContactsManager();    }    public void deletRow(int id){        this.sqlDB = this.getWritableDatabase();        this.sqlDB.delete(LATLNG_TABLE, "id=?", new String[]{Integer.toString(id)});        closeContactsManager();    }    public Cursor execQuery(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy ){        this.sqlDB = this.getReadableDatabase();        Cursor cursor = this.sqlDB.query(table,columns,selection,selectionArgs,groupBy,having,orderBy);        return cursor;    }    public void closeContactsManager(){        this.sqlDB.close();    }}
  • listView文件MyListView.java
package com.studio.wythe.wind;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.ActionMode;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.haarman.listviewanimations.itemmanipulation.AnimateDismissAdapter;import com.haarman.listviewanimations.itemmanipulation.OnDismissCallback;import java.util.ArrayList;import java.util.Iterator;public class MyListView extends AppCompatActivity {    private CustomAdapter customAdapter;    private boolean isInActionMode;    private boolean isInDeleteMode = false;    private AnimateDismissAdapter<Model> mAnimateDismissAdapter;    private ArrayList<Integer> mCheckedPositions;    private ListView lvList;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_list_view);        lvList = (ListView) findViewById(R.id.lvList);        storeDataToDB();        showDBDebugInfo();        customAdapter = new CustomAdapter();        mCheckedPositions = new ArrayList<Integer>();        mAnimateDismissAdapter = new AnimateDismissAdapter<Model>(                customAdapter,new CustomDismissCallback());        mAnimateDismissAdapter.setAbsListView(lvList);        lvList.setAdapter(mAnimateDismissAdapter);        lvList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);        lvList.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {            @Override            public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {                Toast.makeText(getApplicationContext(),""+lvList.getCheckedItemCount(),                        Toast.LENGTH_SHORT).show();                customAdapter.models.get(position).setChecked(checked);                customAdapter.notifyDataSetChanged();                mode.setSubtitle(lvList.getCheckedItemCount()                        +" item selected");                if(mCheckedPositions.contains(position)&&!checked){                    mCheckedPositions.remove(Integer.valueOf(position));//                    Toast.makeText(getApplicationContext(),"contition 1",Toast.LENGTH_SHORT).show();                }else{                    mCheckedPositions.add(position);//                    Toast.makeText(getApplicationContext(),"contition 2",Toast.LENGTH_SHORT).show();                }            }            @Override            public boolean onCreateActionMode(ActionMode mode, Menu menu) {                MenuInflater inflater = mode.getMenuInflater();                inflater.inflate(R.menu.context_menu,menu);                mode.setTitle("Delete");                isInActionMode = true;                isInDeleteMode = false;                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.delete:                        mAnimateDismissAdapter.animateDismiss(mCheckedPositions);                        isInDeleteMode = true;                        mode.finish();                        return true;                    default:                        return false;                }            }            @Override            public void onDestroyActionMode(ActionMode mode) {                if(!isInDeleteMode){                    for(Model model:customAdapter.models){                        model.setChecked(false);                    }                    mCheckedPositions.clear();                }                isInActionMode=false;            }        });    }    public final class ViewHolder{        public ImageView img;        public TextView phone;        public CheckBox checkBok;        public TextView name;    }    public class CustomAdapter extends BaseAdapter {        private ArrayList<Model> models;        public CustomAdapter(){            models = new ArrayList<Model>();            DatabaseManager DBManager = new DatabaseManager(MyListView.this);            SQLiteDatabase db = DBManager.getWritableDatabase();            Cursor cursor = db.query(DBManager.CONTACT_TABLE,null,DBManager.CONTACT_NAME+" LIKE ?",                    new String[]{"Mike%"},null,null,DBManager.CONTACT_NAME);            while(cursor.moveToNext()){                String phoneNum = cursor.getString(cursor.getColumnIndex(DBManager.CONTACT_PHONE_NUM));                String name = cursor.getString(cursor.getColumnIndex(DBManager.CONTACT_NAME));                models.add(new Model(phoneNum,name));            }            db.close();        }        @Override        public int getCount() {            return models.size();        }        @Override        public Object getItem(int position) {            return models.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        //更新每个ListView的Item的显示状态        @Override        public View getView(int position, View convertView, ViewGroup parent) {            ViewHolder viewHolder;            Model model = customAdapter.models.get(position);            if(convertView == null){                convertView = getLayoutInflater().inflate(                        R.layout.list_view_item,parent,false);                viewHolder = new ViewHolder();                viewHolder.img = (ImageView) convertView.findViewById(R.id.ivContact);                viewHolder.phone = (TextView) convertView.findViewById(R.id.tvPhone);                viewHolder.checkBok = (CheckBox) convertView.findViewById(R.id.chb);                viewHolder.name = (TextView) convertView.findViewById(R.id.tvName);                convertView.setTag(viewHolder);            }else{                viewHolder = (ViewHolder) convertView.getTag();            }            viewHolder.phone.setText(model.getPhoneNum());            viewHolder.checkBok.setChecked(model.isChecked());            viewHolder.name.setText(model.getName());            viewHolder.checkBok.setVisibility(isInActionMode? View.VISIBLE:View.GONE);            return convertView;        }    }    //数据类,为每个item提供数据    public class Model{        private String phoneNum;        private boolean isChecked;        private String name;        public Model(String phoneNum,String name){            this.phoneNum = phoneNum;            this.name = name;            this.isChecked = false;        }        public String getPhoneNum(){            return phoneNum;        }        public String getName(){            return this.name;        }        public boolean isChecked(){            return isChecked;        }        public void setPhoneNum(String phoneNum){            this.phoneNum = phoneNum;        }        public void setChecked(boolean isChecked){            this.isChecked = isChecked;        }    }    //删除动画完成后调用的接口,处理数据库的数据同步    private class CustomDismissCallback implements OnDismissCallback {        @Override        public void onDismiss(AbsListView absListView, int[] ints) {            mCheckedPositions.clear();            Iterator<Model> iterator = customAdapter.models.iterator();            for(int i = 0; i < customAdapter.models.size(); i++){                DatabaseManager DBManager = new DatabaseManager(MyListView.this);                SQLiteDatabase db = DBManager.getWritableDatabase();                if(customAdapter.models.get(i).isChecked) {                    db.delete(DBManager.CONTACT_TABLE, DBManager.CONTACT_NAME + " = ?", new String[]{customAdapter.models.get(i).getName()});                }            }            while(iterator.hasNext()){                if(iterator.next().isChecked){                    iterator.remove();                }            }            //更新ListView            customAdapter.notifyDataSetChanged();        }    }    private void storeDataToDB(){        DatabaseManager DBManager = new DatabaseManager(this);        SQLiteDatabase db = DBManager.getWritableDatabase();        ContentValues cv = new ContentValues();        for(int i= 0; i < 10; i++){            String phoneNum = "1565937759"+i;            String name = "Mike"+i;            cv.put(DBManager.CONTACT_PHONE_NUM,phoneNum);            cv.put(DBManager.CONTACT_NAME,name);            db.insert(DBManager.CONTACT_TABLE,null,cv);        }        db.close();    }    private void showDBDebugInfo(){        DatabaseManager DBManager = new DatabaseManager(this);        SQLiteDatabase db = DBManager.getReadableDatabase();        Cursor cursor = db.query(DBManager.CONTACT_TABLE,null,DBManager.CONTACT_NAME+" LIKE ?",                new String[]{"Mike%"},null,null,DBManager.CONTACT_NAME);        while(cursor.moveToNext()){            Log.i("DatabaseDebug",cursor.getString(cursor.getColumnIndex(DBManager.CONTACT_NAME))                    +" "+cursor.getString(cursor.getColumnIndex(DBManager.CONTACT_PHONE_NUM)));        }        db.close();    }}
0 0