Android 使用自定义GestureDetector.SimpleOnGestureListener获取项目在列表视图中的位置
我有一个自定义列表适配器,它使用ViewHolder模式设置一个OnTouchListener,将事件传递给扩展SimpleNogestureListener的自定义手势侦听器Android 使用自定义GestureDetector.SimpleOnGestureListener获取项目在列表视图中的位置,android,listview,onclicklistener,swipe,android-gesture,Android,Listview,Onclicklistener,Swipe,Android Gesture,我有一个自定义列表适配器,它使用ViewHolder模式设置一个OnTouchListener,将事件传递给扩展SimpleNogestureListener的自定义手势侦听器 public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if(convertView == null){ convertVi
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if(convertView == null){
convertView = inflator.inflate(R.layout.list_item_swipeable, null);
holder = new ViewHolder();
// holder.container = (LinearLayout) convertView.findViewById(R.id.container);
holder.container = (FrameLayout) convertView.findViewById(R.id.container);
holder.created_at = (TextView) convertView.findViewById(R.id.list_item_created_at);
holder.link = (TextView) convertView.findViewById(R.id.list_item_link);
holder.origin = (TextView) convertView.findViewById(R.id.list_item_origin);
holder.mDetector = new GestureDetectorCompat(mContext, new MyGestureListener (mContext, convertView));
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.created_at.setText( mData.get(position).getCreated_at());
holder.link.setText( mData.get(position).getLink());
holder.origin.setText( mData.get(position).getOrigin());
holder.container.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
holder.mDetector.onTouchEvent(event);
return true;
}
});
return convertView;
}
手势侦听器覆盖OnFling,以便检测每行的滑动,使内容不可见,并显示一些按钮
public class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
private static final int MIN_DISTANCE = 50;
private static final String TAG = "MyGestureListener";
private RelativeLayout backLayout;
private LinearLayout frontLayout;
private Animation inFromRight,outToRight,outToLeft,inFromLeft;
private ViewGroup.LayoutParams frontParams;
private ViewGroup.LayoutParams backParams;
public MyGestureListener(Context ctx, View convertView) {
backLayout = (RelativeLayout) convertView.findViewById(R.id.layout_back);
frontLayout = (LinearLayout) convertView.findViewById(R.id.layout_front);
inFromRight = AnimationUtils.loadAnimation(ctx, R.anim.in_from_right);
outToRight = AnimationUtils.loadAnimation(ctx, R.anim.out_to_right);
outToLeft = AnimationUtils.loadAnimation(ctx, R.anim.out_to_left);
inFromLeft = AnimationUtils.loadAnimation(ctx, R.anim.in_from_left);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
float diffX = e2.getX() - e1.getX();
float diffY = e2.getY() - e1.getY();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > MIN_DISTANCE) {
if(diffX<0){
Log.v(TAG, "Swipe Right to Left");
if(backLayout.getVisibility()==View.GONE){
frontParams = frontLayout.getLayoutParams();
backParams = backLayout.getLayoutParams();
Log.d("HEIGHT FRONT ", ": "+frontParams.height ); // why -1?
Log.d("HEIGHT BACK ", ": "+backParams.height ); // why -1?
frontLayout.startAnimation(outToLeft);
backLayout.setVisibility(View.VISIBLE);
backLayout.startAnimation(inFromRight);
frontLayout.setVisibility(View.INVISIBLE);
}
}else{
Log.v(TAG, "Swipe Left to Right");
if(backLayout.getVisibility()!=View.GONE){
backLayout.startAnimation(outToRight);
backLayout.setVisibility(View.GONE);
frontLayout.setVisibility(View.VISIBLE);
frontLayout.startAnimation(inFromLeft);
}
}
}
}
return true;
}
}
公共类MyGestureListener扩展了GestureDetector.SimpleOnGestureListener{
专用静态最终整数最小距离=50;
私有静态最终字符串标记=“MyGestureListener”;
私人相亲后台布局;
私人线路布局的正面布局;
私有动画右、右、左、右;
private ViewGroup.LayoutParams frontParams;
private ViewGroup.LayoutParams backParams;
公共MyGestureListener(上下文ctx,视图转换视图){
backLayout=(RelativeLayout)convertView.findViewById(R.id.layout\u back);
frontLayout=(LinearLayout)convertView.findViewById(R.id.layout_front);
INFOROMRIGHT=AnimationUtils.loadAnimation(右起的ctx、R.anim.in);
outToRight=AnimationUtils.loadAnimation(ctx,R.anim.out\u至\u右侧);
outToLeft=AnimationUtils.loadAnimation(ctx,R.anim.out\u向左);
INFOROMLEFT=AnimationUtils.loadAnimation(ctx,R.anim.in_从_左起);
}
@凌驾
公共布尔onFling(运动事件e1、运动事件e2、浮点速度X、,
浮动速度y){
float diffX=e2.getX()-e1.getX();
float diffY=e2.getY()-e1.getY();
if(Math.abs(diffX)>Math.abs(diffY)){
如果(数学绝对值(diffX)>最小距离){
如果(diffXuseAdapterView#getPositionForView
方法,但老实说RecyclerView
和ItemTouchHelper
要好得多。我不知道应该在哪里以及如何使用该方法。我需要知道单击的项目的位置,以便在单击一行时,我在新活动中打开其详细信息。但是onTouchListener我的适配器截取了所有的东西。我找不到在MyTestUrListInter中使用GePosithFoeVIEW的方法。在构造函数中,我有转换视图,但是不能调用它。抱歉,这是我第一次使用自定义手势侦听器,我不知道如何使用它。我选择了ListVIEW,因为它是在我找到JSON-PAR的第一个教程中找到的。使用自定义适配器sed(也是第一次)。如果你说我也可以使用Recycler视图实现刷卡、单击和jSon解析,如果你能指导我,我可能愿意尝试一下
lv = (ListView) findViewById(R.id.list);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//String p = (String) parent.getItemAtPosition(position);
String link_id = linkList.get(position).getId();
Toast.makeText(getApplicationContext(),
"item clicked: "+position+"\n link id: "+link_id, Toast.LENGTH_SHORT).show();
}
});