8

私のアプリで、ネイティブの連絡先アプリと同じ動作をしたいと思います。具体的には、callの場合は右にスワイプし、textmsgの場合は左にスワイプします。ListViewを使用し、arrayAdapterを設定し、onFlingMethodのジェスチャ検出器を実装しました。スワイプ側を正しくインターセプトし、Callアプリを起動できます。アイテム番号(およびその他の情報)をインテントに入力する必要があるため、スワイプしたアイテムを取得する必要があります。ここに私のコードがあります。

public class Contacts extends Activity implements OnGestureListener {

    private static final String TAG = "[Contacts]";
    ArrayList < ContactInfo > mData;

    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;

    /** Called when the activity is first created. */
    private GestureDetector detector = new GestureDetector(this);
    Button btnContacts;
    Button btnProfile;
    Button btnSettings;
    ImageButton btnStatus;
    HandleServer cubeServer;
    Button slideHandleButton;
    SlidingDrawer slidingDrawer;
    String filter = "n";
    ArrayAdapter < ContactInfo > adapter;
    ListView listView;


    public boolean onCreateOptionsMenu(Menu menu) {

        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        return true;
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contact);

        listView = (ListView) findViewById(R.id.arrayList);
        listView.setCacheColorHint(R.color.white);

        mData = getContact();

        adapter = new ArrayAdapter < ContactInfo > (this.getApplicationContext(), R.layout.row, R.id.nome, mData) {
            public View getView(final int position, View convertView, ViewGroup parent) {
                ViewHolder viewHolder = null;
                if (convertView == null) {

                    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    convertView = inflater.inflate(R.layout.row, null);
                    viewHolder = new ViewHolder();
                    final ContactInfo item = getItem(position);

                    viewHolder.name.setText(item.getName());


                    convertView.setClickable(true);

                    OnClickListener myClickListener = new OnClickListener() {

                        public void onClick(View v) {
                            Intent intent = new Intent(v.getContext(), ContactTabs.class);
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            //Log.i(TAG,"id value:"+item.getId());
                            intent.putExtra("id", item.getId());
                            intent.putExtra("name", item.getName());
                            //aggiungi quello che serve per gli extra ed i task
                            intent.putExtra("calendar", item.getCalendarDraw());
                            intent.putExtra("gmail", item.getGmailDraw());
                            intent.putExtra("operator", item.getOperatorDraw());
                            intent.putExtra("imgStatus", item.getImgStatusDraw());
                            startActivity(intent);
                        }
                    };

                    convertView.setOnClickListener(myClickListener);

                    convertView.setOnTouchListener(new OnTouchListener() {

                        public boolean onTouch(View view, MotionEvent e) {
                            detector.onTouchEvent(e);
                            return false;
                        }
                    });

                    return convertView;
                }
            };

            listView.setAdapter(adapter);
        }

        public boolean onDown(MotionEvent e) {
            // TODO Auto-generated method stub
            return false;
        }

        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {

                    return false;
                }
                // right to left swipe
                if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    //CallNativeApp cna = new CallNativeApp(getApplicationContext());
                    //cna.sendSms("11111", "");
                    Toast.makeText(getApplicationContext(), "Left Swipe", Toast.LENGTH_SHORT).show();
                } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    //CallNativeApp cna = new CallNativeApp(getApplicationContext());
                    //cna.call("1111");

                    Toast.makeText(getApplicationContext(), "Right Swipe", Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
                // nothing
            }

            return true;
        }
        public void onLongPress(MotionEvent e) {
            // TODO Auto-generated method stub

        }
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
            // TODO Auto-generated method stub
            return true;
        }
        public void onShowPress(MotionEvent e) {
            // TODO Auto-generated method stub

        }
        public boolean onSingleTapUp(MotionEvent e) {
            // TODO Auto-generated method stub
            return true;
        }

    }
}
4

3 に答える 3

7

私はこの問題をListView.pointToPosition()メソッドで解決します。

ここに私のコードの断片があります:

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
    float velocityX, float velocityY) {

    if (e2.getX() - e1.getX() > MOVE) {

        int id = list.pointToPosition((int) e1.getX(), (int) e1.getY());
        Reminder temp = (Reminder) adapter.getItem((id));
        return true;
    }

    return false;
}

まず、からrowIDを取得し、必要な処理をlist.pointToPosition((int) e1.getX(), (int) e1.getY());行います。私の場合、リマインダーはリスト用のカスタム配列アダプター内のオブジェクトのタイプです。

于 2012-08-21T11:32:37.183 に答える
0

これを行う方法は、メインアクティビティではなく、OnClickListenerの場合と同様に、GestureListenerを行に追加することだと思います。

リストが大きい場合、それは多くのGestureListenerを意味し、パフォーマンスに影響を与える可能性があります。その場合、スワイプ位置とビューを使用して、スワイプされたビューを計算する方がよい場合があります。

于 2012-06-26T13:01:57.913 に答える
0

最後に、リストビューで左または右にスワイプすると、ソリューションのインデックスを取得しました。@ Override public boolean onFling(MotionEvent e1、MotionEvent e2、float speedX、float speedY){

        boolean result = false;
        try {
            float diffY = e2.getY() - e1.getY();
            float diffX = e2.getX() - e1.getX();
            if (Math.abs(diffX) > Math.abs(diffY)) {
                if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffX > 0) {
                         int id = list.pointToPosition((int) e1.getX(), (int) e1.getY());
                          task = (TaskClass) adapter.getItem((id));
                         Log.e("Result", "Result..."+task.toString());
                        onSwipeRight(task.milestonetask);
                    } else {
                         int id = list.pointToPosition((int) e1.getX(), (int) e1.getY());
                          task = (TaskClass) adapter.getItem((id));
                        onSwipeLeft(task.milestonetask);
                    }
                }
            } else {
                if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffY > 0) {
                        onSwipeBottom();
                    } else {
                        onSwipeTop();
                    }
                }
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return result;
    }
于 2014-02-01T08:36:15.347 に答える