Android RecyclerView 클릭, 긴 이벤트 기준 적용: OnItemTouchListener + GestureDetector 기반
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.