繁体   English   中英

单击侦听器适用于回收者视图,但适用于其他视图

[英]Click listener working for recycler view but for other views

我有一个回收站视图,列表中有一个列表,视图单元格上有一个进度条。 当我单击其他视图时,发生单击事件。 但是当按回收商视图项目时,什么也没有发生。 请告诉我原因。 我粘贴下面的oncreateview持有人的代码。

class MockSeriesViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView examMeta;
    RecyclerView subjectBubbles;
    BubbleAdapter adapter;
    NumberProgressBar numberProgressBar;


    public MockSeriesViewHolder(final View itemView) {
        super(itemView);
        examMeta = (TextView) itemView.findViewById(R.id.tv_exam_meta);
        numberProgressBar = (NumberProgressBar) itemView.findViewById(R.id.pb_exam_progress);

        subjectBubbles = (RecyclerView) itemView.findViewById(R.id.rv_subject_bubbles);
        subjectBubbles.setHasFixedSize(true);
        subjectBubbles.setLayoutManager(new LinearLayoutManager(itemView.getContext(), LinearLayoutManager.VERTICAL, false));
        adapter = new BubbleAdapter(itemView.getContext());
        subjectBubbles.setAdapter(adapter);

        itemView.setOnClickListener(this);

    }

    public void renderMockTestSeries(TestSeriesTest test) {
        adapter.setItems(test.getSubjects());
        examMeta.setText(test.getNoOfQuestions() + " QUESTIONS     " + (test.getTimeLimitInSeconds() / 60) + " MINUTES");
        numberProgressBar.setProgress(test.getPercentageOfCompletion());
    }

    @Override
    public void onClick(View view) {
        TestSeriesTest series = getItem(getLayoutPosition());
        mListener.onTestSeriesTestClicked(series);
    }
}

然后单击列表器类是

public interface TestSeriesTestClickListener {
public void onTestSeriesTestClicked(TestSeriesTest mockTest);}

创建一个名为RecyclerItemClickListener的类:

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

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {  
private OnItemClickListener mListener;

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

GestureDetector mGestureDetector;

public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
    mListener = listener;
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return true;
        }
    });
}

@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
    View childView = view.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
        mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
}

然后将以下代码添加到您的活动中:

recyclerView.addOnItemTouchListener(  
new RecyclerItemClickListener(context, new  RecyclerItemClickListener.OnItemClickListener() {
  @Override public void onItemClick(View view, int position) {
    // TODO Handle item click
  }
})
);

仅此而已。 您可以在OnItemClick中输入代码,并在其中获得项目位置

RecyclerItemClickListener

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {  
private OnItemClickListener mListener;

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

GestureDetector mGestureDetector;

public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
    mListener = listener;
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return true;
        }
    });
}

@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
    View childView = view.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
        mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
}

ClickListener

recyclerView.addOnItemTouchListener(  
new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() {
  @Override public void onItemClick(View view, int position) {
    // TODO Handle item click
  }
})
);

我的性格是您的subjectBubbles必须包含可点击的项目,以防止click事件传播到父视图。
检查您的BubbleAdapter ,查看其中是否有任何点击事件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM