java - 在我的 Recycler 视图的适配器类中的 OnTouch 和 onClick 事件中出现问题
问题描述
我正在开发我的应用程序。在我的应用程序的主屏幕中,我有一个 Horizontal RecyclerView,它从 Firebase 的图像下方加载图像和名称。当用户单击图像并且我还想突出显示图像时,我想将用户发送到另一个活动。
我的问题是我在 Adapter 类中使用了 OnTouch 方法来突出显示图像,但是当我这样做时,它只会在单击时突出显示图像。我想将用户发送到另一个活动,并且我还想突出显示图像。所以为此,我在我的代码中使用了意图。但是当我在我的代码中使用意图时,它成功地将用户发送到另一个活动,但问题是当用户点击返回到另一个活动后,图像仍然突出显示。
所以结论是我在我的代码中遇到问题我希望当用户单击图像时它会突出显示图像并将用户发送到没有任何错误的新活动。
这是我的代码: -
public class TrendingSongsAdapter extends RecyclerView.Adapter<TrendingSongsAdapter.ViewHolder> {
public static final String TAG = "RecyclerViewAdaper";
// private ArrayList<String> mNames = new ArrayList<>();
// private ArrayList<String> mImageUrls = new ArrayList<>();
private List<Upload> mUploads;
private OnItemListener mOnItemListener;
private Context mContext;
public TrendingSongsAdapter(Context context, List<Upload> uploads, OnItemListener onItemListener) {
// mNames = names ;
// mImageUrls = imageUrls;
mUploads = uploads;
mContext = context;
this.mOnItemListener = onItemListener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.trending_song_items_view, parent, false);
return new ViewHolder(view, mOnItemListener);
}
@SuppressLint("ClickableViewAccessibility")
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
Upload uploadCurrent = mUploads.get(position);
holder.name.setText(uploadCurrent.getName());
Glide.with(mContext)
.asBitmap()
.load(uploadCurrent.getImageUri())
.centerCrop()
.into(holder.image);
holder.image.setOnTouchListener(new View.OnTouchListener() {
Rect rect;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
holder.image.setColorFilter(Color.argb(50, 0, 0, 0));
rect = new Rect(view.getLeft(), view.getRight(), view.getTop(), view.getBottom());
}
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
holder.image.setColorFilter(Color.argb(0, 0, 0, 0));
}
if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
if (!rect.contains(view.getLeft() + (int) motionEvent.getX(), view.getTop() + (int) motionEvent.getY())) {
holder.image.setColorFilter(Color.argb(0, 0, 0, 0));
}
}
Intent intent = new Intent(mContext , D.class);
mContext.startActivity(intent);
return false;
}
});
}
@Override
public int getItemCount() {
return mUploads.size();
}
public interface OnItemListener {
void onItemClick(int position);
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
ImageView image;
TextView name;
OnItemListener onItemListener;
public ViewHolder(View itemview, OnItemListener onItemListener) {
super(itemview);
image = itemview.findViewById(R.id.image_view);
name = itemview.findViewById(R.id.name);
this.onItemListener = onItemListener;
itemview.setOnClickListener(this);
}
@Override
public void onClick(View view) {
onItemListener.onItemClick(getAdapterPosition());
}
}
}
如果您有任何解决方案,请帮助我。
感谢您阅读我的问题。
解决方案
尝试将 else 添加到每个 if 条件并重置图像状态,在您的情况下,您想从中删除突出显示
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
holder.image.setColorFilter(Color.argb(50, 0, 0, 0));
rect = new Rect(view.getLeft(), view.getRight(), view.getTop(), view.getBottom());
}
else{ // set here image resource}
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
holder.image.setColorFilter(Color.argb(0, 0, 0, 0));
}
else{// set here image resource}
if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
if (!rect.contains(view.getLeft() + (int) motionEvent.getX(), view.getTop() + (int) motionEvent.getY())) {
holder.image.setColorFilter(Color.argb(0, 0, 0, 0));
}
else{// set here image resource}
}
推荐阅读
- javascript - 如何检测点击元素的右半部分和左半部分
- ios - Alamofire 5 - 对成员'upload(multipartFormData:to:usingThreshold:method:headers:interceptor:fileManager:)'的模糊引用
- kentico - Kentico Forms - CMSCheckbox 总是呈现一个空标签
- javascript - 如何使用 setTimeout 在数字数组上像 cos 图一样循环两次
- go - 如何使用来自 fmt.scan 的操作员输入进行计算?
- javascript - Cypress : Setting a variable from the result of a task
- firebase - Firebase 数据库检查 Flutter 的 ListField 中是否存在元素
- c# - 在异常消息中打印 ICollection 中的元素数
- macos - 将 Visual Studio Code 二进制文件添加到 Mac 中的路径,找不到命令,尽管它在 $PATH 中
- apache-spark - 如何在 Spark Dataframe 中像 SQL 一样实现 EXISTS 条件