gpt4 book ai didi

android - 滑动以显示在 Android 中使用 RecyclerView 创建的列表上的操作按钮

转载 作者:太空狗 更新时间:2023-10-29 14:39:47 26 4
gpt4 key购买 nike

我的应用程序的主 Activity 有一个自定义列表,每个列表项应在向左滑动时显示与其关联的操作按钮,并在再次向右滑动同一列表项时隐藏该按钮。现在,我尝试通过创建滑动检测器类来检测每个列表项的滑动事件,然后将其设置为 ItemHolder 类中列表项的触摸监听器。

但是,由于 RecyclerView 是可滚动的,因此无法检测到单个列表项上的滑动。如何检测对单个列表项的滑动?

MainActivity - onCreate()

 protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_recycler);

ArrayList<Subject> subjects = new ArrayList<>();

subjects.add(new Subject(1, "Physics"));
subjects.add(new Subject(2, "Chemistry"));
subjects.add(new Subject(3, "Biology"));

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.subject_recycler_list_view);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
SubjectRecyclerListAdapter adapter = new SubjectRecyclerListAdapter(getApplicationContext(), R.layout.row_layout , subjects);

recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(layoutManager);
}

滑动检测器

public class SwipeDetector implements View.OnTouchListener {
static final int MIN_DISTANCE = 50;
private float downX, downY, upX, upY;

public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
downX = event.getX();
downY = event.getY();
// return true;
}
case MotionEvent.ACTION_UP: {
upX = event.getX();
upY = event.getY();

float deltaX = downX - upX;
float deltaY = downY - upY;

// swipe horizontal?
if ( Math.abs(deltaX) > MIN_DISTANCE){
// left or right
if ( deltaX < 0){
Log.i("Swipe Detector","LeftToRightSwipe!");
return true;
}
if ( deltaX > 0){
Log.i("Swipe Detector","RightToLeftSwipe!");
return true;
}
} else{
Log.i("Swipe Detector","Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE);
}
}
}

return false;
}
}

itemHolder - 构造函数

public SubjectHolder(Context context, View itemView) {
super(itemView);

this.subjectTextView = (TextView) itemView.findViewById(R.id.name);

SwipeDetector swipeDetector = new SwipeDetector();
itemView.setOnTouchListener(swipeDetector);
}

滑动检测适用于任何其他 View ,除了 RecyclerView 的列表项(或任何其他可 ScrollView 的 subview )。如何检测列表项上的滑动?

最佳答案

问题解决了,但我不知道这样做是否正确,但它确实有效。事情是这样的——

创建一个接口(interface) SwipeActions,其中包含两个方法,用于左右滑动的回调。

滑动操作

public interface SwipeActions {
public void onLeftSwipe(MotionEvent e);
public void onRightSwipe(MotionEvent e);
}

然后将 SwipeAction 作为 SwipeDetector 的属性之一提及,然后在构造函数中将其初始化。

public class SwipeDetector implements View.OnTouchListener {
static final int MIN_DISTANCE = 50;
private float downX, downY, upX, upY;
public SwipeActions swipeActions;

public SwipeDetector(SwipeActions swipeActions) {
this.swipeActions = swipeActions;
}

public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
downX = event.getX();
downY = event.getY();
}
case MotionEvent.ACTION_UP: {
upX = event.getX();
upY = event.getY();

float deltaX = downX - upX;
float deltaY = downY - upY;

if ( Math.abs(deltaX) > MIN_DISTANCE){
if ( deltaX < 0){
swipeActions.onRightSwipe(event);
return true;
}
if ( deltaX > 0){
swipeActions.onLeftSwipe(event);
return true;
}
} else{
Log.i("Swipe Detector","Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE);
}
}
}

return false;
}
}

Swipe ActionsMotionEvent 对象作为参数,该对象将在 MainActivity 中用于检索 subview 的对象滑动被执行。所以将 MainActivity 修改为这个 -

MainActivity - onCreate

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_recycler);

ArrayList<Subject> subjects = new ArrayList<>();

subjects.add(new Subject(1, "Physics"));
subjects.add(new Subject(2, "Chemistry"));
subjects.add(new Subject(3, "Biology"));

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.subject_recycler_list_view);

RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
SubjectRecyclerListAdapter adapter = new SubjectRecyclerListAdapter(getApplicationContext(), R.layout.row_layout , subjects);
SwipeDetector swipeDetector = new SwipeDetector(new SwipeActions() {
@Override
public void onLeftSwipe(MotionEvent evnt) {
View childView = recyclerView.findChildViewUnder(evnt.getX(), evnt.getY());
if(childView != null) {
// Perform your action on childView (Swiped List Item)
}
else {
Log.i("Main Recycler Activity", "Child View is Null");
}
}

@Override
public void onRightSwipe(MotionEvent evnt) {
View childView = recyclerView.findChildViewUnder(evnt.getX(), evnt.getY());
if(childView != null) {
if(swipedViews.contains(childView)) {
// Perform your action on childView (Swiped List Item)
}
}
else {
Log.i("Main Recycler Activity", "Child View is Null");
}
}
});

recyclerView.setOnTouchListener(swipeDetector);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(layoutManager);
}

此外,我从 itemHolder 中删除了 TouchListener

itemHolder - 构造函数

public SubjectHolder(Context context, View itemView) {
super(itemView);

this.subjectTextView = (TextView) itemView.findViewById(R.id.name);
}

关于android - 滑动以显示在 Android 中使用 RecyclerView 创建的列表上的操作按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50206588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com