Быстрое управление различными предметами в представлении переработчика - PullRequest
1 голос
/ 01 ноября 2019

Моя проблема в том, что у меня есть вид рециркулятора, который открывает диалоговое окно при нажатии на них, но при быстром нажатии на два разных элемента открывается два диалоговых окна.

Как я могу решить эту проблему?

Я пробовал

, используя bool перед действием click:

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

            }
        })

, но это просто решилослучай, когда я дважды касаюсь одного и того же предмета, но не когда быстро нажимаю на разные.

надеюсь, вы мне поможете, что мне делать.

РЕДАКТИРОВАТЬ

Я бы предпочел решить эту проблему с помощью адаптера, потому что я буду использовать решение для других представлений переработчика, а другие не будут вызывать диалоговое окно.

Мой класс адаптера:

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

1 Ответ

1 голос
/ 01 ноября 2019

Если вы предпочитаете исправить это с вашего адаптера, я думаю, вы могли бы исправить это, объявив 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;, если вы хотите снова получать события щелчка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...