我有一个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;
}
}
谢谢。
答案 0 :(得分:1)
您必须添加tp 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删除脚蹼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);
}
这对我有用。
}