如何使用AdapterViewFlipper同时检测Clicklistner和访客

时间:2019-03-19 10:13:14

标签: android

  • 我有一个AdapterViewFlipper,我需要在其中收听左右滑动以更改当前项目,以及一个clickListner来了解用户选择的项目。

  • 到目前为止,我可以使用 CustomGestureDetector 来检测滑动并相应地进行更改。 onSingleTapUp(),但是没有给我点击的项目位置。

  • 如果我在适配器类中编写 OnCLickListner ,guestureDetector将无法工作。如何同时获得滑动列表器和clickListner(以了解从阵列中选择了哪个项目)。

我的活动课程:

 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;
    }
}

谢谢。

1 个答案:

答案 0 :(得分:1)

您必须添加tp 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删除脚蹼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);
        }

这对我有用。

}