Android 使用自定义GestureDetector.SimpleOnGestureListener获取项目在列表视图中的位置

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

我有一个自定义列表适配器,它使用ViewHolder模式设置一个OnTouchListener,将事件传递给扩展SimpleNogestureListener的自定义手势侦听器

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)>最小距离){

如果(diffXuse
AdapterView#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();
    }
});