GVKun编程网logo

从RecyclerView.OnItemTouchListener传递MotionEvents到GestureDetectorCompat(sorted传递reverse=true)

6

如果您想了解从RecyclerView.OnItemTouchListener传递MotionEvents到GestureDetectorCompat的相关知识,那么本文是一篇不可错过的文章,我们将对

如果您想了解从RecyclerView.OnItemTouchListener传递MotionEvents到GestureDetectorCompat的相关知识,那么本文是一篇不可错过的文章,我们将对sorted传递reverse=true进行全面详尽的解释,并且为您提供关于.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 5 times. Giving up.、 <_getSelectedIndex> 的有价值的信息。

本文目录一览:

从RecyclerView.OnItemTouchListener传递MotionEvents到GestureDetectorCompat(sorted传递reverse=true)

从RecyclerView.OnItemTouchListener传递MotionEvents到GestureDetectorCompat(sorted传递reverse=true)

我有一个实现RecyclerView.OnItemTouchListener的片段。如何 将ReclickerView
事件和单击和Long-click运动事件
传递给GestureDetectorCompat。这就是说,我只想处理单击和长按,其余事件应该由RecyclerView处理,因为它通常会发生。我该如何设置?

public class MyFragment extends Fragment implements RecyclerView.OnItemTouchListener,        GestureDetector.OnGestureListener {    protected RecyclerView recyclerView;    protected RecyclerView.Adapter adapter;    protected LinearLayoutManager layoutManager;    private GestureDetectorCompat detector;    public MyFragment() {        // Required empty public constructor    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        View rootView = inflater.inflate(R.layout.myfrag, container, false);        recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview);        layoutManager = new LinearLayoutManager(getActivity());        recyclerView.setLayoutManager(layoutManager);        recyclerView.addOnItemTouchListener(this);        adapter = new MyAdapter(myData));        recyclerView.setAdapter(adapter);        return rootView;    }    @Override    public boolean onDown(MotionEvent e) {        return false;    }    @Override    public void onShowPress(MotionEvent e) {    }    @Override    public boolean onSingleTapUp(MotionEvent e) {        return false;    }    @Override    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {        return false;    }    @Override    public void onLongPress(MotionEvent e) {    }    @Override    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {        return false;    }    @Override    public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent event) {        return false;    }    @Override    public void onTouchEvent(RecyclerView recyclerView, MotionEvent event) {    }}

答案1

小编典典

您必须GestureDetectorCompatonCreateView()方法中进行初始化:

@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,                         Bundle savedInstanceState) {    View rootView = inflater.inflate(R.layout.myfrag, container, false);    detector = new GestureDetectorCompat(getActivity(), new RecyclerViewOnGestureListener());    recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview);    layoutManager = new LinearLayoutManager(getActivity());    recyclerView.setLayoutManager(layoutManager);    recyclerView.addOnItemTouchListener(this);    adapter = new MyAdapter(myData));    recyclerView.setAdapter(adapter);    return rootView;}

RecyclerViewOnGestureListener是您自己的内部类扩展SimpleOnGestureListener(提供OnGestureListener方法的空实现)

private class RecyclerViewOnGestureListener extends SimpleOnGestureListener {    @Override    public boolean onSingleTapConfirmed(MotionEvent e) {        View view = recyclerView.findChildViewUnder(e.getX(), e.getY());        int position = recyclerView.getChildPosition(view);        // handle single tap        return super.onSingleTapConfirmed(e);    }    public void onLongPress(MotionEvent e) {        View view = recyclerView.findChildViewUnder(e.getX(), e.getY());        int position = recyclerView.getChildPosition(view);        // handle long press        super.onLongPress(e);    }}

现在看一行(来自onCreateView()方法):

recyclerView.addOnItemTouchListener(this);

在我们的例子中,“ this” OnItemTouchListener包含两个我们需要实现的方法:

@Overridepublic boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {    detector.onTouchEvent(e);    return false;}@Overridepublic void onTouchEvent(RecyclerView rv, MotionEvent e) {}

这是这些方法的含义的解释:https
:
//developer.android.com/reference/android/support/v7/widget/RecyclerView.OnItemTouchListener.html

您只需要处理来自的单击和长按事件即可RecyclerView

.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 5 times. Giving up.

.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 5 times. Giving up.

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 5 times. Giving up.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
	at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2385)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2306)
	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834)
	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
	at sun.reflect.GeneratedConstructorAccessor4.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:346)
	at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:443)
	at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:141)
	at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:111)
	at cn.qjj.mysql.MySQLPool.getNewConnection(MySQLPool.java:72)
	at cn.qjj.mysql.MySQLPool.init(MySQLPool.java:63)
	at cn.qjj.mysql.MySQLPool.<init>(MySQLPool.java:32)
	at cn.qjj.mysql.MySQLPool.getInstance(MySQLPool.java:39)
	at cn.qjj.mysql.SqlUtils.<clinit>(SqlUtils.java:33)
	at cn.qjj.solr.MsgUtil.main(MsgUtil.java:31)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
	at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1112)
	at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2483)
	at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2324)
	... 18 more
java.lang.NullPointerException
	at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011)
	at java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1006)
	at cn.qjj.mysql.MySQLPool.init(MySQLPool.java:63)
	at cn.qjj.mysql.MySQLPool.<init>(MySQLPool.java:32)
	at cn.qjj.mysql.MySQLPool.getInstance(MySQLPool.java:39)
	at cn.qjj.mysql.SqlUtils.<clinit>(SqlUtils.java:33)
	at cn.qjj.solr.MsgUtil.main(MsgUtil.java:31)



<oracle.adf.view> <SimpleSelectOneRenderer> <_getSelectedIndex> <Could not find selected item matchi

<_getSelectedIndex>

在进入页面的时候,经常会见到log 日志控制台会抛出如下提示信息:

<oracle.adf.view> <SimpleSelectOneRenderer> <_getSelectedindex> <Could not find selected item matching value "{0}" in {1}>
<oracle.adf.view> <SimpleSelectOneRenderer> <_getSelectedindex> <Could not find selected item matching value "{0}" in {1}>
<oracle.adf.view> <SimpleSelectOneRenderer> <_getSelectedindex> <Could not find selected item matching value "{0}" in {1}>
<oracle.adf.view> <SimpleSelectOneRenderer> <_getSelectedindex> <Could not find selected item matching value "{0}" in {1}>
<oracle.adf.view> <SimpleSelectOneRenderer> <_getSelectedindex> <Could not find selected item matching value "{0}" in {1}>

如图:


解决办法如下:在给字段设置lov的时候,去掉勾选是否包含空选项,如图:去掉最下方 Include "No Selection Item"



Android ListView与OnItemClickListener和GestureDetector

Android ListView与OnItemClickListener和GestureDetector

我有一个以下ListActivity:
public class ShowDayActivity extends ListActivity implements OnItemClickListener {
    private GestureDetector gestureDetector;
    private View.OnTouchListener gestureListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.day);
        registerForContextMenu(getListView());

        gestureDetector = new GestureDetector(new MyGestureDetector());
        gestureListener = new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v,MotionEvent event) {
                return gestureDetector.onTouchEvent(event);
            }
        };

        getListView().setonItemClickListener(this);
        getListView().setonTouchListener(gestureListener);
    }

    @SuppressWarnings("static-access")
    @Override
    public boolean onoptionsItemSelected(MenuItem item) {
        ...
        return super.onoptionsItemSelected(item);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        ...
        return super.onContextItemSelected(item);
    }

    Override
    public void onItemClick(AdapterView<?> parent,View v,int pos,long id) {
        editEvent(pos);
    }

    class MyGestureDetector extends SimpleOnGestureListener {
        private static final int SWIPE_MIN_disTANCE = 120;
        private static final int SWIPE_MAX_OFF_PATH = 250;
        private static final int SWIPE_THRESHOLD_VELociTY = 200;

        @Override
        public boolean onFling(MotionEvent e1,MotionEvent e2,float veLocityX,float veLocityY) {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
               return false;
            }
            // right to left swipe
            if (e1.getX() - e2.getX() > SWIPE_MIN_disTANCE && Math.abs(veLocityX) > SWIPE_THRESHOLD_VELociTY) {
                Log.d("ICS-Calendar","Fling left");
                return true;
            } else if (e2.getX() - e1.getX() > SWIPE_MIN_disTANCE && Math.abs(veLocityX) > SWIPE_THRESHOLD_VELociTY) {
                Log.d("ICS-Calendar","Fling right");
                return true;
            }

            return false;
        }
    }   
}

listItems上的contextListener(long-click)完美地工作.今天我添加了gestureListener和Detector,它也是这样,但是:

GestureDetector检测到一切都没有了,但是在完成了逻辑之后,会打开上下文菜单,这显然不是我想要的.任何想法我做错了,还是我可以做什么?

解决方法

通常,您需要调用cancelLongPress()方法,并检测到onFling后的所有视图的子项.但是对于AbsListView,这个方法什么也不做:(

但是我已经找到了解决方法:在onFling回调中,处理完所有内容后,为ListView对象执行下一步:

Event cancelEvent = Event.obtain(ev2);
cancelEvent.setAction(MotionEvent.ACTION_UP);
listView.onTouchEvent(cancelEvent);

Android RecyclerView 单击、长按事件:基于 OnItemTouchListener +GestureDetector 标准实现(二),封装抽取成通用工具类

Android RecyclerView 单击、长按事件:基于 OnItemTouchListener +GestureDetector 标准实现(二),封装抽取成通用工具类



Android RecyclerView 单击、长按事件:基于 OnItemTouchListener +GestureDetector 标准实现(二),封装抽取成通用工具类


我写的附录文章 2,介绍了 Android 如何基于 OnItemTouchListener +GestureDetector 实现单击、长按事件的监听,由于如今 RecyclerView 在 Android 开发是如此的普遍,以及 RecyclerView 的单击事件是如此的常用,如果像附录文章 2 那样把一堆事件监听写到业务逻辑代码里面,那得写多少遍重复代码!所以我把给 RecyclerView 添加点击事件的 Listener 抽取、封装成一个常用的工具栏类 RecyclerViewUtil。
在给一个 RecyclerView 添加单击事件时候,跟 ListView 的监听事件一样,只需要简单的写如下代码即可完成:

//第一步,先初始化RecyclerViewUtil,传入当前的RecyclerView对象和上下文指针this:Context
        RecyclerViewUtil util=new RecyclerViewUtil(this,mRecyclerView);

        //第二步,直接set
        util.setOnItemClickListener(new RecyclerViewUtil.OnItemClickListener() {
            @Override
            public void onItemClick(int position, View view) {
                //Toast.makeText(getApplicationContext(),position+" 单击",Toast.LENGTH_SHORT).show();
            }
        });


长按事件也类似:

//先初始化RecyclerViewUtil,传入当前的RecyclerView对象和上下文指针this:Context
        RecyclerViewUtil util=new RecyclerViewUtil(this,mRecyclerView);

        util.setOnItemLongClickListener(new RecyclerViewUtil.OnItemLongClickListener() {
            @Override
            public void onItemLongClick(int position, View view) {
                //Toast.makeText(getApplicationContext(),position+" 长按",Toast.LENGTH_SHORT).show();
            }
        });


封装、抽取好的通用 RecyclerViewUtil.java 全部代码:

package zhangphil.app;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;


/**
 * Created by Phil on 2016/11/19.
 */

public class RecyclerViewUtil {
    private RecyclerView mRecyclerView = null;
    private GestureDetector mGestureDetector = null;
    private RecyclerView.SimpleOnItemTouchListener mSimpleOnItemTouchListener;
    private OnItemClickListener mOnItemClickListener = null;
    private OnItemLongClickListener mOnItemLongClickListener = null;
    private Context context;

    public RecyclerViewUtil(Context context, RecyclerView recyclerView) {
        this.context = context;
        this.mRecyclerView = recyclerView;

        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            //长按事件
            @Override
            public void onLongPress(MotionEvent e) {
                super.onLongPress(e);
                if (mOnItemLongClickListener != null) {
                    View childView = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
                    if (childView != null) {
                        int position = mRecyclerView.getChildLayoutPosition(childView);
                        mOnItemLongClickListener.onItemLongClick(position, childView);
                    }
                }
            }

            //单击事件
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                if (mOnItemClickListener != null) {
                    View childView = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
                    if (childView != null) {
                        int position = mRecyclerView.getChildLayoutPosition(childView);
                        mOnItemClickListener.onItemClick(position, childView);
                        return true;
                    }
                }

                return super.onSingleTapUp(e);
            }
        });

        mSimpleOnItemTouchListener = new RecyclerView.SimpleOnItemTouchListener() {
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
                if (mGestureDetector.onTouchEvent(e)) {
                    return true;
                }
                return false;
            }
        };

        mRecyclerView.addOnItemTouchListener(mSimpleOnItemTouchListener);
    }

    public void setOnItemClickListener(OnItemClickListener l) {
        mOnItemClickListener = l;
    }

    public void setOnItemLongClickListener(OnItemLongClickListener l) {
        mOnItemLongClickListener = l;
    }

    //长按事件接口
    public interface OnItemLongClickListener {
        public void onItemLongClick(int position, View view);
    }

    //单击事件接口
    public interface OnItemClickListener {
        public void onItemClick(int position, View view);
    }
}


使用时候直接把 RecyclerViewUtil.java 复制到自己的项目代码工程中即可。


附录:
1,《RecyclerView 点击事件》链接:http://blog.csdn.net/zhangphil/article/details/46771865
2,《Android RecyclerView 单击、长按事件标准实现:基于 OnItemTouchListener + GestureDetector》:http://blog.csdn.net/zhangphil/article/details/53230157

今天关于从RecyclerView.OnItemTouchListener传递MotionEvents到GestureDetectorCompatsorted传递reverse=true的分享就到这里,希望大家有所收获,若想了解更多关于.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 5 times. Giving up.、 <_getSelectedIndex> 等相关知识,可以在本站进行查询。

本文标签: