java - 在回收站 View 中快速管理点击不同的项目

标签 java android android-recyclerview

我的问题是我有一个回收器 View ,当点击它们时会打开一个对话框,但是当快速点击两个不同的项目时它会打开两个对话框。

我该如何解决这个问题?

我试过了

在点击 Action 之前使用 boolean 值:

holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View v) {
                if(!clicked[0]){
                    clicked[0] = true;
                    if (mListener != null) {
                        mListener.onClickBoard(mValues.get(i));
                    }else{
                        ((MainActivity)mContext).onClickBoard(mValues.get(i).getAreaId(), mValues.get(i).getName());
                    }
                }

            }
        })

但这只是解决了当我双击同一个项目时的情况,而不是当我快速点击不同的项目时。

希望你能帮帮我,我该怎么办。

编辑

我更愿意从适配器中解决它,因为我会将解决方案用于其他回收站 View ,而其他人不会调用对话框。

我的适配器类:

public class MyBoardAdapter extends RecyclerView.Adapter<MyBoardAdapter.ViewHolder> {

    private List<Board> mValues;
    private Context mContext;
    private final OnBoardFragmentInteractionListener mListener;

    public MyBoardAdapter(List<Board> mValues, OnBoardFragmentInteractionListener mListener, Context context) {
        this.mValues = mValues;
        this.mContext = context;
        this.mListener = mListener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_board, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int i) {
        holder.mItem = mValues.get(i);
        holder.tvName.setText(holder.mItem.getName());
        holder.tvWaiter.setVisibility(View.GONE);
        holder.tvCount.setVisibility(View.GONE);
        final boolean[] clicked = {false};
        GestureDetector gestureDetector;
        byte[] decodedString = Base64.decode(holder.mItem.getSrc(), Base64.DEFAULT);
        try {
            Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
            holder.ivTable.setImageBitmap(decodedByte);
        } catch (Exception e) {
            e.printStackTrace();
        }

        Map<String, String> map = isEmpty(holder.mItem.getAreaId(), holder.mItem.getName());
        if (!map.isEmpty()) {
            holder.ivTable.setImageResource(R.mipmap.ic_launcher_atento_round);
            holder.tvWaiter.setText(map.get("name"));
            holder.tvWaiter.setVisibility(View.VISIBLE);
            holder.tvCount.setText("(" + map.get("count") + ")");
            holder.tvCount.setVisibility(View.VISIBLE);
        }

        gestureDetector = new GestureDetector(mContext, new GestureDetector.SimpleOnGestureListener(){

        });
        holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View v) {
                if(!clicked[0]){
                    clicked[0] = true;
                    if (mListener != null) {
                        mListener.onClickBoard(mValues.get(i));
                    }else{
                        ((MainActivity)mContext).onClickBoard(mValues.get(i).getAreaId(), mValues.get(i).getName());
                    }
                }

            }
        });
    }

    @Override
    public int getItemCount() {
        return mValues.size();
    }

    public void setmValues(List<Board> mValues) {
        this.mValues = mValues;
        notifyDataSetChanged();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public final View mView;
        @BindView(R.id.ivBoard)
        ImageView ivTable;
        @BindView(R.id.tvName)
        TextView tvName;
        @BindView(R.id.tvWaiter)
        TextView tvWaiter;
        @BindView(R.id.tvCount)
        TextView tvCount;

        public Board mItem;

        public ViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
            this.mView = itemView;
        }

        @Override
        public String toString() {
            return "ViewHolder{" +
                    "mView=" + mView +
                    ", ivTable=" + ivTable +
                    ", tvName=" + tvName +
                    ", tvWaiter=" + tvWaiter +
                    ", tvCount=" + tvCount +
                    ", mItem=" + mItem +
                    '}';
        }
    }

    public Map<String, String> isEmpty(String area, String mesa) {
        Map<String, String> response = new HashMap<>();
        if (!mOcu.get(0).isEmpty()) {
            for (int i = 0; i <= mOcu.get(0).size() - 1; i++) {
                if (mOcu.get(0).get(i).trim().equals(area.trim()) && mesa.equals(mOcu.get(1).get(i))) {
                    Log.i("Mesa Ocupada", mOcu.get(0).get(i) + " -- " + mOcu.get(1).get(i));
                    response.put("code", mOcu.get(2).get(i));
                    response.put("name", mOcu.get(3).get(i));
                    response.put("count", mOcu.get(5).get(i));
                    return response;
                }
            }
        }
        return response;
    }

}

对话代码:

public void dialogCustomer() {
        View mView = getLayoutInflater().inflate(R.layout.dialog_customer, null);

        final AlertDialog dialog = new AlertDialog.Builder(this).setView(mView).create();

        final TextView tvCustomer = (TextView) mView.findViewById(R.id.tvCustomer);
        final EditText etCustomer = (EditText) mView.findViewById(R.id.etCustomer);
        final Button btnSubmit = (Button) mView.findViewById(R.id.btnSubmit);

        tvCustomer.setText("Atento Cliente");
        btnSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startHomeActivity(etCustomer.getText().toString());
                dialog.dismiss();
            }
        });

        etCustomer.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                    startHomeActivity(etCustomer.getText().toString());
                    dialog.dismiss();
                    return true;
                }
                return false;
            }
        });

        dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                orderFragment = (OrderFragment) getSupportFragmentManager().findFragmentByTag("orderFragment");
                if (orderFragment == null) {
                    new AccessBoardAsyncTask(mContext).execute("L", mBoard);
                }
            }
        });

        dialog.show();
    }

最佳答案

如果您更喜欢从您的适配器修复它,我认为您可以修复它,在您的适配器中声明一个 private boolean disableViews = false;,然后调用 notifyDataSetChanged();在用户点击 holder.mView 之后:

if (!disableViews) {
    holder.mView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
            if (mListener != null) {
                mListener.onClickBoard(mValues.get(i));
            }else{
                ((MainActivity)mContext).onClickBoard(mValues.get(i).getAreaId(), mValues.get(i).getName());
            }
            disableViews = true;
            notifyDataSetChanged();
        }
    });
} else {
    holder.mView.setOnClickListener(null);
}

然后设置disableViews = false;当你想再次接收点击事件。

关于java - 在回收站 View 中快速管理点击不同的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58663178/

相关文章:

java - 使具有相同删除二进制文件的通用返回类型兼容吗?

android - 用不同颜色绘制 FILL_AND_STROKE 表格

java - FileUtils copyURLToFile BasicAuthenication

android - Android 30+ 中的视频捕获 Intent - 只有所有者才能与待处理项目交互

Android Studio 渲染库

android - 将 RecyclerView 项目拖放后在 SQLite 中的新位置存储

android - 优化 RecyclerView/ListView

android - 监听RecyclerView中的ViewHolders被回收

java - Scala.Byte vs java.lang.Byte - 推荐使用哪个?

java - MainActivity 到 Fragment,然后从该 Fragment 返回到 MainActivity