Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在回收器视图中快速管理不同的项目_Java_Android_Android Recyclerview - Fatal编程技术网

Java 在回收器视图中快速管理不同的项目

Java 在回收器视图中快速管理不同的项目,java,android,android-recyclerview,Java,Android,Android Recyclerview,我的问题是,我有一个“回收器”视图,当点击它们时,它会打开一个对话框,但当快速点击两个不同的项目时,它会打开两个对话框 我怎样才能解决这个问题 我试过了 在单击操作之前使用布尔: holder.mView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { if(!clicked[0

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

我怎样才能解决这个问题

我试过了

在单击操作之前使用布尔:

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

}

如果您喜欢从适配器修复它,我认为您可以通过声明
private boolean disableview=false来修复它代码,然后调用
notifyDataSetChanged()在用户点击持有者后。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);
}

然后设置
disableview=false当您希望再次接收单击事件时

发布完整的适配器代码可能这可以从对话框中修复,您使用的是
DialogFragment
还是简单的
AlertDialog
?也请发布您的对话框实现。@JulioLemus是的,但我想将该解决方案用于其他回收器视图,它们的行为与此不同我以前尝试过此方法,但不起作用,因为IDE要求变量为最终变量,这没有意义,因为我需要更改状态,解决方案是使变量成为全局变量,您应该将其添加到您的答案中。谢谢你:沉闷?这很奇怪,即使我看到你的监听器被标记为final
private final OnBoardFragmentInteractionListener mListener但在我的情况下,我不需要它。但无论如何,很高兴知道你解决了这个问题。
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);
}