1

ListActivity を拡張するクラスがあります。このクラスは、バス ID で満たされた AbsListView と各行のバス名を表示します...スワイプジェスチャを行うときに行のバス名を処理しようとします...('onFling') しかし、それを行うと、ジェスチャは正しく処理されますが、最初の行のビュー (findViewByID() を使用) を取得することしかできません。Flinged 行のビューを取得する必要があります。

ありがとうございました!

これは私のコードです...:

public class dayBusList extends ListActivity{

     AbsListView lv;
 AABDatabaseManager db;

     GestureDetector mGestureDetector = null;
 View.OnTouchListener mGestureListener = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        db = new AABDatabaseManager(dayBusList.this);
        setListAdapter(new SpeechListAdapter(this));



        lv = getListView();
        lv.setTextFilterEnabled(true);
        lv.setBackgroundColor(0xffffffff);
        lv.setFastScrollEnabled(true);
        lv.setSoundEffectsEnabled(true);

        //Gesture detector for swipe...

         mGestureDetector = new GestureDetector(new MyGestureDetector());

             mGestureListener = new View.OnTouchListener() {
                public boolean onTouch(View v, MotionEvent aEvent) {

                    if (mGestureDetector.onTouchEvent(aEvent))
                        return true;
                    else
                        return false;
                    }
                };
       lv.setOnTouchListener(mGestureListener);

.......>リストビューのアダプター

private class SpeechListAdapter extends BaseAdapter {

         private Context mContext;
         private String[] busIDS = db.getDayBusIds();
         private String[] busNAMES = db.getDayBusNames();

            public SpeechListAdapter(Context context) {

                mContext = context;
            }

            public int getCount() {
                return busNAMES.length;
            }

            public Object getItem(int position) {
                return position;
            }

            public long getItemId(int position) {
                return position;
            }

            public View getView(int position, View convertView, ViewGroup parent) {
                SpeechView sv;

                if (convertView == null) {
                    sv = new SpeechView(mContext, busIDS[position],
                            busNAMES[position]);
                } else {
                    sv = (SpeechView) convertView;
                    sv.setTitle(busIDS[position]);
                    sv.setDialogue(busNAMES[position]);
                }
                return sv;
            }

         }

        private class SpeechView extends LinearLayout {

            private TextView busID;
            private TextView busNAME;

            public SpeechView(Context context, String title, String words) {
                super(context);

                this.setOrientation(HORIZONTAL);

                ImageView busIcon = new ImageView(context);
                busIcon.setImageResource(R.drawable.stm);
                busIcon.setPadding(2, 20, 5, 20);
                addView(busIcon,new LinearLayout.LayoutParams(
                        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

                busID = new TextView(context);
                busID.setId(1);
                busID.setTextSize(30);
                busID.setTextColor(Color.BLUE);
                busID.setPadding(5, 15, 5, 20);
                //busID.setPadding(0, 0,10, 0);
                busID.setText(title);
                addView(busID, new LinearLayout.LayoutParams(
                        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

                busNAME = new TextView(context);
                busNAME.setId(2);
                busNAME.setGravity(Gravity.TOP);
                busNAME.setTextSize(15);
                busNAME.setPadding(0, 0, 0, 0);
                busNAME.setText(words);
                busNAME.setTextColor(Color.GREEN);
                busNAME.setWidth(160);
                addView(busNAME, new LinearLayout.LayoutParams(
                        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
             }

            public void setTitle(String id) {
                busID.setText(id);
            }

            public void setDialogue(String name) {
                busNAME.setText(name);
            }
        }

.......>ジェスチャー検出のクラス

class MyGestureDetector extends SimpleOnGestureListener {
    private static final int SWIPE_MIN_DISTANCE = 200;
    private static final int SWIPE_MAX_OFF_PATH = 100;
    private static final int SWIPE_THRESHOLD_VELOCITY = 100;

    @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                float dX = e2.getX()-e1.getX();
                float dY = e1.getY()-e2.getY();
                if (Math.abs(dY)<SWIPE_MAX_OFF_PATH &&
                    Math.abs(velocityX)>=SWIPE_THRESHOLD_VELOCITY &&
                    Math.abs(dX)>=SWIPE_MIN_DISTANCE ) {
                    if (dX>0) {
                        Toast.makeText(getApplicationContext(), ((TextView) findViewById(1)).getText()+"Right Swipe", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getApplicationContext(), ((TextView) findViewById(1)).getText()+"Left Swipe", Toast.LENGTH_SHORT).show();
                    }
                    return true;
                } 
                return false;
            }

        }
4

2 に答える 2

1

1 つのオプションは、SpeechView クラスの onTouchEvent() をオーバーライド/実装し、SpeechView インスタンス自体でスワイプを処理することです。その後、SpeechView インスタンスのプロパティを調べて、どの行がスワイプされたかを知ることができます。

public class SpeechView extends LinearLayout
{
    @Override
    public boolean onTouchEvent(MotionEvent ev)
    {
        // 1) process any specific SpeecView instance variables.
        // 2) pass event to a gestureDetector.
        return true;
    }

}

さらに、GestureDetector を SpeechListAdapter に渡し、最初に作成されたときに SpeechView クラスにフィードすることができます。次に、MotionEvents をそれに渡すことができます。

いずれの場合も、trueを返すことでタッチ イベントをインターセプトしてください。

public boolean onTouchEvent(MotionEvent me)
{
    m_gestureDetector.onTouchEvent(me);
    return true;
}
于 2011-02-18T08:42:13.590 に答える
0

あなたはたまたま、findViewById(1))実際に定義されている幸運です。ジェスチャ検出器で findViweById を呼び出さないでください。クラッシュしないことに驚いています。

代わりに、onGestureListener でビューを取得します。そこで使ってください。

于 2010-12-15T21:20:14.213 に答える