0

各画像に「タッチ」の側面を追加しようとしていることを除いて、このチュートリアルに従っています。

ご覧のHelloGridViewとおり、チュートリアルとまったく同じです。

public class HelloGridView extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        GridView gridview = (GridView) findViewById(R.id.gridview);
        gridview.setAdapter(new ImageAdapter(this));

        gridview.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                Toast.makeText(HelloGridView.this, "" + position, Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

についてImageAdapterは、次を追加しましたonTouchListener

public class ImageAdapter extends BaseAdapter {
    private Context mContext;

    // create a new ImageView for each item referenced by the Adapter
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ImageView imageView;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(300, 300));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(mThumbIds[position]);

        imageView.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) { 
                if(event.getAction() == MotionEvent.ACTION_DOWN) {
                    Log.v("log_tag", "MotionEvent.ACTION_DOWN");
                    return true;
                } else if(event.getAction()==MotionEvent.ACTION_UP){
                    Toast.makeText(mContext, "ACTION_UP", Toast.LENGTH_SHORT).show();
                    Log.v("log_tag", "MotionEvent.ACTION_UP");
                    return false;
                } else {
                    return false; 
                }
            } 
        }); 

        return imageView;
    }
}

問題は、画像の 1 つに触れるたびに、 で発火しますが、 ではonTouchListener発火しませImageAdapterん。onItemClickListenerHelloGridView

onItemClickListenerで起動したいACTION_UPので、イベントが の場合は false を返し、 の場合はMotionEvent.ACTION_UPtrueを返しますMotionEvent.ACTION_DOWN

私の理解では、true を返すonTouchListenerと、イベントが消費されて終了します。しかし、false を返すと、onTouchListenerはイベントを消費せず、 in に渡されonItemClickListenerますHelloGridView

HelloGridView残念ながら、イベントが のときに false を返す場合にのみ、イベントが渡されACTION_DOWNます。しかし、私がそれを行うと、ACTION_UP実行されることはありません。誰かが私が間違っていることと、それを修正する方法を教えてもらえますか? 私の質問が明確でない場合は、お知らせください。明確にするよう努めます。:)

4

2 に答える 2

1

このコードは

@Override
    public boolean onTouch(View v, MotionEvent event) {

        switch(event.getAction())
        {
        case MotionEvent.ACTION_DOWN:

            break;         
        case MotionEvent.ACTION_MOVE:

            break;   

        case MotionEvent.ACTION_UP:

            if(!mIsTouchHandeled){
                int position = mChatListView.pointToPosition((int) event.getX(), (int) event.getY());
                if(position!=ListView.INVALID_POSITION){
                    mChatListView.performItemClick(mChatListView.getChildAt(position-mChatListView.getFirstVisiblePosition()), position, mChatListView.getItemIdAtPosition(position));
                }
            }
            break;
        }           
        //       return super.onTouchEvent(event);       


        return false;
    }

}
于 2014-03-31T12:58:29.490 に答える
0

OnItemClickListener は Action.Down でのみ発生します。

次のことを行うだけです: OnItemClickListener を取り除き、独自のメソッドに置き換えます。" " のようなものpublic void myOnItemActionUp(View view, int pos)- なんでも。

あなたの参照をHelloGridViewImageAdapter に渡し、 OnTouchListener を呼び出しmHelloGridView.myOnItemActionUp(v, position)ますif (event.getAction() == MotionEvent.ACTION_UP)

于 2013-01-15T09:08:49.667 に答える