Android 在联系人列表的列表视图中使用滑动进行呼叫

Android 在联系人列表的列表视图中使用滑动进行呼叫,android,listview,Android,Listview,我正在开发一个应用程序,它允许在数据库中创建联系人,并在列表视图中显示联系人 目前我有: 数据库: public class Contact { private int CTC_ID; private byte[] CTC_IMAGE; public String CTC_NOM; public String CTC_NUMERO; public Contact(){ } public Contact(int CTC_ID, byt

我正在开发一个应用程序,它允许在数据库中创建联系人,并在列表视图中显示联系人

目前我有:

数据库:

public class Contact {

    private int CTC_ID;
    private byte[]  CTC_IMAGE;
    public String CTC_NOM;
    public String CTC_NUMERO;

    public Contact(){
    }

    public Contact(int CTC_ID, byte[] CTC_IMAGE, String CTC_NOM, String CTC_NUMERO){
        this.CTC_ID = CTC_ID;
        this.CTC_IMAGE = CTC_IMAGE;
        this.CTC_NUMERO = CTC_NOM;
        this.CTC_NUMERO = CTC_NUMERO;
    }



    public int getCTC_ID(){
        return CTC_ID;
    }
    public void setCTC_ID(int CTC_ID) {

        this.CTC_ID = CTC_ID;
    }

    public byte[] getCTC_IMAGE(){
        return CTC_IMAGE;
    }
    public void setCTC_IMAGE(byte[] CTC_IMAGE) {
        this.CTC_IMAGE = CTC_IMAGE;
    }

    public String getCTC_NOM() {

        return CTC_NOM;
    }
    public void setCTC_NOM(String CTC_NOM) {
        this.CTC_NOM = CTC_NOM;
    }

    public String getCTC_NUMERO() {

        return CTC_NUMERO;
    }
    public void setCTC_NUMERO(String CTC_NUMERO) {

        this.CTC_NUMERO = CTC_NUMERO;
    }


    public String toString(){
        return "ID : "+CTC_ID+"\nimage : "+CTC_IMAGE+"\nnom : "+CTC_NOM+"\nnumero : "+CTC_NUMERO;
    }
}
数据库助手:

public class DatabaseHelper extends SQLiteOpenHelper {

    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "kids_phone";

    // Table Names
    private static final String TABLE_CONTACT = "Contact";
    private static final String TABLE_MESSAGE = "Message";
    private static final String TABLE_ASSOCIER = "Associer";

    // Common column names
    private static final String KEY_CTC_ID = "CTC_ID";
    private static final String KEY_MES_ID = "MES_ID";
    private static final String KEY_ASS_ID = "ASS_ID";

    // Contact Table - column names
    public static final String KEY_CTC_IMAGE = "CTC_IMAGE";
    public static final String KEY_CTC_NOM = "CTC_NOM";
    public static final String KEY_CTC_NUMERO = "CTC_NUMERO";

    // Message Table - column names
    private static final String KEY_MES_TITRE = "MES_TITRE";
    private static final String KEY_MES_CONTENU = "MES_CONTENU";

    // Associer Table - column names
    private static final String KEY_ASS_IMG = "ASS_IMG";
    private static final String KEY_ASS_MES_ID = "ASS_MES_ID";
    private static final String KEY_ASS_CTC_ID = "ASS_CTC_ID";

    // Contact table Create Statements
    private static final String CREATE_TABLE_CONTACT = "CREATE TABLE "
            + TABLE_CONTACT + " (" + KEY_CTC_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_CTC_IMAGE
            + " BLOB," + KEY_CTC_NOM + " TEXT," + KEY_CTC_NUMERO + " TEXT NOT NULL);";

    // Message table create statement
    private static final String CREATE_TABLE_MESSAGE = "CREATE TABLE " + TABLE_MESSAGE
            + " (" + KEY_MES_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_MES_TITRE + " TEXT,"
            + KEY_MES_CONTENU + " TEXT NOT NULL);";

    // Associer table create statement
    private static final String CREATE_TABLE_ASSOCIER = "CREATE TABLE "
            + TABLE_ASSOCIER + " (" + KEY_ASS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_ASS_IMG + " TEXT,"
            + KEY_ASS_MES_ID + " INTEGER," + KEY_ASS_CTC_ID + " INTEGER);";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        // creating required tables
        db.execSQL(CREATE_TABLE_CONTACT);
        db.execSQL(CREATE_TABLE_MESSAGE);
        db.execSQL(CREATE_TABLE_ASSOCIER);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // on upgrade drop older tables
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACT);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_MESSAGE);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_ASSOCIER);

        // create new tables
        onCreate(db);
    }

    private static SQLiteDatabase bdd;
    static ArrayList<Contact> contactListe = new ArrayList<Contact>();

    public void open() {
        //on ouvre la BDD en écriture
        SQLiteDatabase bdd = this.getWritableDatabase();
    }

    public void close() {
        //on ferme l'accès à la BDD
        bdd.close();
    }


    public long insertContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();
        //Création d'un ContentValues (fonctionne comme une HashMap)
        ContentValues values = new ContentValues();
        //on lui ajoute une valeur associé à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
        values.put(KEY_CTC_IMAGE, contact.getCTC_IMAGE());
        values.put(KEY_CTC_NOM, contact.getCTC_NOM());
        values.put(KEY_CTC_NUMERO, contact.getCTC_NUMERO());
        //on insère l'objet dans la BDD via le ContentValues
        long CTC_ID = db.insert(TABLE_CONTACT, null, values);

        return CTC_ID;
    }

    public Cursor fetchAllContact() throws SQLException {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor mCursor = db.query(TABLE_CONTACT, new String[]{"CTC_ID _id", KEY_CTC_IMAGE, KEY_CTC_NUMERO}, null, null, null, null, null);

        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }

    public ArrayList<Contact> getListContact(){
        String selectQuery = "SELECT  * FROM " + TABLE_CONTACT;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        ArrayList<Contact> contactList = new ArrayList<Contact>();
        if (cursor.moveToFirst()) {
            do {
                Contact list = new Contact();
                list.setCTC_ID(Integer.parseInt(cursor.getString(0)));
                list.setCTC_IMAGE(cursor.getBlob(1));
                list.setCTC_NOM(cursor.getString(2));
                list.setCTC_NUMERO(cursor.getString(3));
                contactList.add(list);
            } while (cursor.moveToNext());
        }
        return contactList;
    }
}
目前,这很好地说明了接触,

因此,当我从左向右滑动时,我希望能拨打这个号码

我试过这个:

public class MainActivity extends Activity  implements SwipeActionAdapter.SwipeActionListener {

    public static int OVERLAY_PERMISSION_REQ_CODE = 1234;
    protected SwipeActionAdapter mAdapter;
    private ListView lstViewContact;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                lstViewContact = (ListView) findViewById(R.id.lvContact);

                displayContact();
}
    public void displayContact() {

        //On ouvre la base de données pour écrire dedans
        DatabaseHelper dbHelper = new DatabaseHelper(this);
        final ContactAdapter contactAdapter = new ContactAdapter(this, dbHelper.getListContact());
        mAdapter = new SwipeActionAdapter(contactAdapter);
        lstViewContact.setAdapter(mAdapter);
    }

    @Override
    public boolean hasActions(int position, SwipeDirection direction) {
        if (direction.isLeft()) return true;
        if (direction.isRight()) return true;
        return false;
    }

    @Override
    public boolean shouldDismiss(int position, SwipeDirection direction) {
        return direction == SwipeDirection.DIRECTION_NORMAL_LEFT;
    }

    @Override
    public void onSwipe(int[] positionList, SwipeDirection[] directionList) {
        for (int i = 0; i < positionList.length; i++) {
            SwipeDirection direction = directionList[i];
            int position = positionList[i];
            String dir = "";

            switch (direction) {
                case DIRECTION_FAR_LEFT:
                    dir = "Far left";
                    break;
                case DIRECTION_NORMAL_LEFT:
                    dir = "Left";
                    break;
                case DIRECTION_FAR_RIGHT:
                    dir = "Far right";
                    break;
                case DIRECTION_NORMAL_RIGHT:
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setTitle("Test Dialog").setMessage("You swiped right").create().show();
                    dir = "Right";
                    break;
            }
            Toast.makeText(
                    this,
                    dir + " swipe Action triggered on " + mAdapter.getItem(position),
                    Toast.LENGTH_SHORT
            ).show();
            mAdapter.notifyDataSetChanged();
        }
    }
}

谢谢你给我带来的帮助。

你需要特别的帮助。幸运的是,
RecyclerView
已经拥有了它

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
[...]
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
    //Remove swiped item from list and notify the RecyclerView
   }
};

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
我要这样做:

public class OnSwipeTouchListener implements View.OnTouchListener {

    ListView list;
    private GestureDetector gestureDetector;
    private Context context;

    public OnSwipeTouchListener(Context ctx, ListView list) {
        gestureDetector = new GestureDetector(ctx, new GestureListener());
        context = ctx;
        this.list = list;
    }

    public OnSwipeTouchListener() {
        super();
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }

    public void onSwipeRight(int pos) {
        Log.d("Swipe Right", String.valueOf(pos));

    }

    public void onSwipeLeft(int pos) {

        Log.d("Swipe left", String.valueOf(pos));
    }

    private final class GestureListener extends GestureDetector.SimpleOnGestureListener {

        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        private int getPostion(MotionEvent e1) {
            return list.pointToPosition((int) e1.getX(), (int) e1.getY());
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2,
                               float velocityX, float velocityY) {
            float distanceX = e2.getX() - e1.getX();
            float distanceY = e2.getY() - e1.getY();
            if (Math.abs(distanceX) > Math.abs(distanceY)
                    && Math.abs(distanceX) > SWIPE_THRESHOLD
                    && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                if (distanceX > 0)
                    onSwipeRight(getPostion(e1));
                else
                    onSwipeLeft(getPostion(e1));
                return true;
            }
            return false;
        }

    }
}
主要活动:

public void displayContact() {

    //On ouvre la base de données pour écrire dedans
    DatabaseHelper dbHelper = new DatabaseHelper(this);
    final ContactAdapter contactAdapter = new ContactAdapter(this, dbHelper.getListContact());
    lstViewContact.setAdapter(contactAdapter);
    lstViewContact.setOnTouchListener(new OnSwipeTouchListener(this, lstViewContact));
}
但我想在我向右滑动应用程序呼叫至列表视图中的号码时,例如,我有2个联系人:

10231XXXXXX 20233xxxxxx


当我刷到2时,它调用数字0233XxXxXx,我的列表是动态的。

当它被调用时,你能检查
hasActions
的值吗?库有问题
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
[...]
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
    //Remove swiped item from list and notify the RecyclerView
   }
};

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
public class OnSwipeTouchListener implements View.OnTouchListener {

    ListView list;
    private GestureDetector gestureDetector;
    private Context context;

    public OnSwipeTouchListener(Context ctx, ListView list) {
        gestureDetector = new GestureDetector(ctx, new GestureListener());
        context = ctx;
        this.list = list;
    }

    public OnSwipeTouchListener() {
        super();
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }

    public void onSwipeRight(int pos) {
        Log.d("Swipe Right", String.valueOf(pos));

    }

    public void onSwipeLeft(int pos) {

        Log.d("Swipe left", String.valueOf(pos));
    }

    private final class GestureListener extends GestureDetector.SimpleOnGestureListener {

        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        private int getPostion(MotionEvent e1) {
            return list.pointToPosition((int) e1.getX(), (int) e1.getY());
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2,
                               float velocityX, float velocityY) {
            float distanceX = e2.getX() - e1.getX();
            float distanceY = e2.getY() - e1.getY();
            if (Math.abs(distanceX) > Math.abs(distanceY)
                    && Math.abs(distanceX) > SWIPE_THRESHOLD
                    && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                if (distanceX > 0)
                    onSwipeRight(getPostion(e1));
                else
                    onSwipeLeft(getPostion(e1));
                return true;
            }
            return false;
        }

    }
}
public void displayContact() {

    //On ouvre la base de données pour écrire dedans
    DatabaseHelper dbHelper = new DatabaseHelper(this);
    final ContactAdapter contactAdapter = new ContactAdapter(this, dbHelper.getListContact());
    lstViewContact.setAdapter(contactAdapter);
    lstViewContact.setOnTouchListener(new OnSwipeTouchListener(this, lstViewContact));
}