Android RecyclerView 클릭, 긴 이벤트 기준 적용: OnItemTouchListener + GestureDetector 기반

5875 단어

Android RecyclerView 클릭, 긴 누르기 이벤트: OnItemTouchListener + GestureDetector 표준에 따라 구현
Android RecyclerView는ListView의 절대 다수의 기능을 가지고 있지만 Android RecyclerView는ListView와 같은 클릭 이벤트, 긴 이벤트의 표준적인 실현 방식을 실현하지 못했다. 내가 부록문장1에서 소개한 방식은 전형적인 RecyclerView의item 클릭 이벤트를 실현했다. 대체적인 사고방식은RecyclerView의 ViewHolder에 View를 추가하는 것이다.클릭 이벤트가 클릭 이벤트의 감청에 이르는 실현 방식은 정상적으로 작동할 수 있지만 그다지 표준적이지 않다.현재 비교적 규범화된 안드로이드의 공식 실현을 제시하고 있다.안드로이드 RecyclerView의 공식 문서를 뒤적였는데, 이 문서에는ListView와 같은 OnItem 클릭 이벤트가 제공되지 않았지만, AddOnItem Touch Listener가 있음을 발견했다. 공식 문서에 따르면 AddOnItem Touch Listener는 안드로이드 공식 문서에 남겨진 클릭 사건의 단서 입구이다.문서에서도 개발자가 이 사건 감청 인터페이스에서 필요한 논리 코드를 실현해야 한다는 것을 암시한다.그러나 new의 한 대상이 직접 전달되면 안드로이드 터치 이벤트의 복잡한 처리를 스스로 해석해야 하기 때문에 다행히 안드로이드 정부에서 Recycler View를 내놓았다.Simple OnItem Touch Listener는 말 그대로 간소화된 OnItem Touch Listener입니다.Simple On Item Touch Listener가 생겼지만 아직 끝나지 않았다. Simple On Item Touch Listener는 사건 차단 처리의 입구일 뿐이기 때문에 진정으로 해야 할 일의 주인공은 Gesture Detector이기 때문이다.Gesture Detector에서 차단된 위탁 관리의 클릭, 긴 누르기 이벤트를 통해 최종적으로RecyclerView의 클릭, 긴 누르기 이벤트를 실현할 수 있습니다.
전체 코드:
package zhangphil.app;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private GestureDetector mGestureDetector;

    //    
    private OnItemLongClickListener mOnItemLongClickListener = new OnItemLongClickListener() {
        @Override
        public void onItemLongClick(int position, View childView) {
            Toast.makeText(getApplication(), "  :" + position, Toast.LENGTH_SHORT).show();
        }
    };

    //    
    private OnItemClickListener mOnItemClickListener = new OnItemClickListener() {
        @Override
        public void onItemClick(int position, View childView) {
            Toast.makeText(getApplication(), "  :" + position, Toast.LENGTH_SHORT).show();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //            RecyclerView
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setAdapter(new ItemAdapter());


        //       、         

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

        mGestureDetector = new GestureDetector(this, 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);
            }
        });
    }

    //      
    public interface OnItemLongClickListener {
        public void onItemLongClick(int position, View childView);
    }

    //      
    public interface OnItemClickListener {
        public void onItemClick(int position, View childView);
    }


    private class ItemViewHolder extends RecyclerView.ViewHolder {
        public TextView text;

        public ItemViewHolder(View itemView) {
            super(itemView);
            text = (TextView) itemView.findViewById(android.R.id.text1);
        }
    }

    private class ItemAdapter extends RecyclerView.Adapter {

        @Override
        public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = View.inflate(parent.getContext(), android.R.layout.simple_list_item_1, null);
            ItemViewHolder holder = new ItemViewHolder(view);
            return holder;
        }

        @Override
        public void onBindViewHolder(ItemViewHolder holder, int position) {
            holder.text.setText(String.valueOf(position));
        }

        @Override
        public int getItemCount() {
            return 99;
        }
    }
}

왜냐하면 나는 onIntercept Touch Event에서 RecyclerView의 터치 이벤트를 차단하고 Gesture Detector 트랜잭션 처리를 통해 더 많은 복잡한 이벤트 처리 인터페이스를 확장하고 봉인할 수 있기 때문이다.
부록: 1, RecyclerView 클릭 이벤트 링크:http://blog.csdn.net/zhangphil/article/details/46771865
전재 대상:https://www.cnblogs.com/hehehaha/p/6147237.html

좋은 웹페이지 즐겨찾기