android - 如何使用 AdapterViewFlipper 检测 clicklistner 和 guesture
问题描述
我有一个 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;
}
}
提前致谢。
解决方案
您必须添加 swip tp imageView 而不是自己的翻转器,因为它 imageview 是被触摸的视图,而不是翻转器
创建接口如下,
public interface ISwip { public void onSwip(MotionEvent event,int position); }
在 MainActivity 中实现这个
public class MainActivity extends AppCompatActivity implements ISwip
使用 ISwip 启动适配器
public class TrendingViewPagerAdapter extends BaseAdapter { ISwip iSwip; public TrendingViewPagerAdapter(Context context, int[] moviePosters, ISwip iSwip) { this.iSwip = iSwip; }
将 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; } });
从 MainActivity 中删除 Flipper ontouch
viewFlipper.setOnTouchListener(new View.OnTouchListener() { });
在 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);
}
这对我有用。
}
推荐阅读
- oop - 使用接口默认方法的基于组件的架构
- python - 如何从一列中提取链接和用户并将它们放在另一列中?
- c# - 缺少源文件的 .asmx 文件不会引发编译错误
- c# - jQuery addClass to HTML Anchor 首次工作
- pine-script - Tradingview Pine 脚本为线条绘制功能提供分辨率错误
- ios - 通过 NSPersistentCloudKitContainer 更新 iCloud Scheme 到最新的 Core Data 版本
- c# - 将填充了位和字节的 ushort[] 反序列化为自定义对象
- reactjs - React Native Drawer Navigator,如何添加图标和图像?
- c++ - “条件跳转或移动取决于未初始化的值”使用 ucontext_t
- pandas - 在 Dask 中使用 pandas cut 功能