2016-01-23 45 views
0

我是Android开发新手,试用RecyclerView。我已经创建了NavigationDrawer进一步的片段,我试图通过使用onSingleTaponInterceptTouchEvent来实现onClick和onLongPress。现在,我试图:无法停止在LongPress上启动活动

从单击启动一个活动,并为onLongPress显示一个Snackbar,但是当我使用LongPress时,它会显示我的Snackbar,然后启动为单击定义的活动。

package com.thenewboston.mynavigation; 


import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.design.widget.Snackbar; 
import android.support.v4.app.Fragment; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.GestureDetector; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.RelativeLayout; 



public class ToolFragment extends Fragment { 


private RecyclerView recyclerView; 
private RecyclerView.Adapter adapter; 
private RecyclerView.LayoutManager layoutManager; 
RelativeLayout tool_layout; 


String[] country = {"Dog", "Car", "Donkey", "WTH", "Lion", "Cat", "Football", "abc", "bcd", "sdad", "srgs", 
     "gkgkf", "dtfhfy", "Hyynw", "CBSE", "vtu"}; 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View rootView = inflater.inflate(R.layout.fragment_tool, container, false); 

    recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view); 
    tool_layout = (RelativeLayout) rootView.findViewById(R.id.tool_layout); 
    adapter = new RecyclerAdapter(country); 
    layoutManager = new LinearLayoutManager(getActivity()); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setHasFixedSize(true); 
    recyclerView.setAdapter(adapter); 


    recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() { 
     @Override 
     public void onmyClick(View view, int position) { 
      Snackbar.make(view, "onClick " + position, Snackbar.LENGTH_SHORT) 
        .setAction("Action", null) 
        .show(); 
      Intent intent = new Intent(getContext(), InnerActivity.class); 
      startActivity(intent); 


     } 

     @Override 
     public void onmyLongClick(View view, int position) { 
      Snackbar.make(view, "onLongPress " + position, Snackbar.LENGTH_SHORT) 
        .setAction("Action", null) 
        .show(); 

     } 
    })); 

    return rootView; 

} 


class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { 


    private GestureDetector gestureDetector; 
    private ClickListener clickListener; // initialise the clickListener in constructor 


    public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) { 

     this.clickListener = clickListener; 

     //Manually start gesture detector 
     gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
      @Override 
      public boolean onSingleTapUp(MotionEvent e) { 
       return true; //this has to be true 
      } 


      @Override 
      public void onLongPress(MotionEvent e) { 
       View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
       if (child != null && clickListener != null) { 
        clickListener.onmyLongClick(child, recyclerView.getChildLayoutPosition(child)); 
       } 
      } 
     }); 

    } 

    @Override 
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 
     gestureDetector.onTouchEvent(e); 
     //single click method goes here 
     View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
     if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { 
      clickListener.onmyClick(child, rv.getChildLayoutPosition(child)); 
     } 
     return false; 


    } 

    @Override 
    public void onTouchEvent(RecyclerView rv, MotionEvent e) { 

    } 

    @Override 
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

    } 

} 


public interface ClickListener { 

    void onmyClick(View view, int position); 

    void onmyLongClick(View view, int position); 
} 


} 

Don't mind the Country names :)

回答

0

我的猜测是因为你调用

 clickListener.onmyClick(child, rv.getChildLayoutPosition(child)); 

public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 

通过这样做,您将事件传递给手势监听器,并且您每次都调用onmyClick方法。

基本上,你调用onmyClick每个运动事件,不管它的类型如何。如果你想走这条路线,你需要保持一些状态,以便跟踪动作事件,并了解它是简单的向下事件还是长按。

+0

同意,但我应该在哪里调用它?在'onSingleTapUp()'里面? –