首页 > 解决方案 > 如何使用 AdapterViewFlipper 检测 clicklistner 和 guesture

问题描述

我的活动课:

 package com.example.adapterviewflipper;

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.AdapterViewFlipper;

    public class MainActivity extends AppCompatActivity {

        AdapterViewFlipper viewFlipper;
        TrendingViewPagerAdapter adapter;
        private GestureDetector mGestureDetector;
        int[] moviePosters = {R.drawable.bladerunner2049,R.drawable.beauty,R.drawable.rush,R.drawable.martian};

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

            CustomGestureDetector customGestureDetector = new CustomGestureDetector();
            mGestureDetector = new GestureDetector(this, customGestureDetector);

            adapter = new TrendingViewPagerAdapter(MainActivity.this,moviePosters);
            viewFlipper.setAdapter(adapter);
            viewFlipper.setFlipInterval(6500);
            viewFlipper.startFlipping();

     viewFlipper.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                    Log.v("AdapterSetOnItemClick"," "+position);
                }
            });

            viewFlipper.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    mGestureDetector.onTouchEvent(event);
                    return true;
                }
            });

        }





        class CustomGestureDetector extends GestureDetector.SimpleOnGestureListener {
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

                // Swipe left (next)
                if (e1.getX() > e2.getX()) {
                    viewFlipper.stopFlipping();
                    viewFlipper.showNext();
                    viewFlipper.startFlipping();
                }

                // Swipe right (previous)
                if (e1.getX() < e2.getX()) {
                    viewFlipper.stopFlipping();
                    viewFlipper.showPrevious();
                    viewFlipper.startFlipping();
                }

                return super.onFling(e1, e2, velocityX, velocityY);
            }

            @Override
            public boolean onSingleTapUp(MotionEvent e) {

                Log.v("AdapterSingleTap",e.toString());
                return super.onSingleTapUp(e);
            }
        }

    }

我的适配器类:

package com.example.adapterviewflipper;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.Toast;

public class TrendingViewPagerAdapter extends BaseAdapter {

    Context context;
    int[] moviePosters;
    LayoutInflater layoutInflater;

    public TrendingViewPagerAdapter(Context context, int[] moviePosters) {
        this.context = context;
        this.moviePosters = moviePosters;
        this.layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }


    @Override
    public int getCount() {
        return moviePosters.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View itemView = layoutInflater.inflate(R.layout.viewflipper_row, parent, false);

        ImageView imageView = itemView.findViewById(R.id.trendingposter_imageview);

        imageView.setImageDrawable(context.getDrawable(moviePosters[position]));

        /*imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Toast.makeText(context,"You clicked "+position,Toast.LENGTH_LONG).show();

            }
        });*/

        return itemView;
    }
}

提前致谢。

标签: android

解决方案


您必须添加 swip tp imageView 而不是自己的翻转器,因为它 imageview 是被触摸的视图,而不是翻转器

  1. 创建接口如下,

    public interface ISwip {
        public void onSwip(MotionEvent event,int position);
    }
    
  2. 在 MainActivity 中实现这个

    public class MainActivity extends AppCompatActivity implements ISwip
    
  3. 使用 ISwip 启动适配器

    public class TrendingViewPagerAdapter extends BaseAdapter {
    ISwip iSwip;
    
    public TrendingViewPagerAdapter(Context context, int[] moviePosters, ISwip iSwip) {
       this.iSwip = iSwip;
    }
    
  4. 将 mGestureDetector 设置为适配器中的 imageView 而不是 viewFlipper,如下所示,

            imageView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                //set interface here and send event back to MainActivity
                iSwip.onSwip(event,position)
                return true;
            }
        });
    
  5. 从 MainActivity 中删除 Flipper ontouch

            viewFlipper.setOnTouchListener(new View.OnTouchListener() {
        });
    
  6. 在 MainActivity 中实现 onSwip

    @Override
    public void onSwip(MotionEvent event, int position) {
    
        itemClicked = position;
        mGestureDetector.onTouchEvent(event);
    }
    

编辑:在接口方法中添加位置作为第二个变量,在 MainActivity 然后在OnSingleTapUp()方法中使用它,如下所示:

class CustomGestureDetector extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

            // Swipe left (next)
            if (e1.getX() > e2.getX()) {
                viewFlipper.stopFlipping();
                viewFlipper.showNext();
                viewFlipper.startFlipping();
            }

            // Swipe right (previous)
            if (e1.getX() < e2.getX()) {
                viewFlipper.stopFlipping();
                viewFlipper.showPrevious();
                viewFlipper.startFlipping();
            }

            return super.onFling(e1, e2, velocityX, velocityY);
        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {

            Toast.makeText(MainActivity.this,"item Selected "+clickedPosition,Toast.LENGTH_LONG).show();
            return super.onSingleTapUp(e);
        }

这对我有用。

}


推荐阅读