java - 我的 Recycler View 的 Adapter 类中的 OnTouch 和 onClick 事件出现问题

标签 java android firebase android-recyclerview

我正在开发我的应用程序。在我的应用程序的主屏幕中,我有一个 Horizo​​ntal RecyclerView,它从 Firebase 加载图像和图像下方的名称。当用户单击图像时,我想将用户发送到另一个 Activity ,并且我也想突出显示该图像。

我的问题是我在 Adapter 类中使用了 OnTouch 方法来突出显示图像,但是当我这样做时,它仅在单击时突出显示图像。我想将用户发送到另一个 Activity ,并且我还想突出显示该图像。因此,为此,我在代码中使用了 intent 。 但是,当我在代码中使用 Intent 时,它成功地将用户发送到另一个 Activity ,但问题是在转到另一个 Activity 后,当用户单击返回时,图像仍然突出显示。

所以结论是我的代码出现问题,我希望当用户单击图像时它会突出显示图像并将用户发送到新的 Activity 而没有任何错误。

这是我的代码:-

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());
        }
    }

}

如果您有任何解决方案,请帮助我。

感谢您阅读我的问题。

最佳答案

尝试向每个 if 条件添加 else 并重置图像状态,如果您想从中删除突出显示

            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}
            }

关于java - 我的 Recycler View 的 Adapter 类中的 OnTouch 和 onClick 事件出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59735779/

相关文章:

java - 本地 Java 项目 jar 未添加到 Maven 构建的 war - Eclipse 3.6 Helios

java - ServerSocket 在单独的线程中抛出 java.net.BindException : bind failed: EACCES (Permission denied) on Android

java - Spring Cloud Eureka : changing heartbeat and discovery path

java - 如何获取设备原始宽度和高度或实际屏幕宽度和高度?

java - 云中的 Firebase JobScheduling |如何使用服务器 SDK 进行作业调度

java - android客户端之间实时通信的最佳方式是什么?

java - 转换字符串时 org.json.JSON.typeMismatch

android - 有什么方法可以从我的 Android 应用程序中找出 Activity 通知的数量?

java - Firebase 结果循环中的空对象引用

android - 无法将 SHA1 指纹添加到 Firebase 控制台