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要求变量为最终变量,这没有意义,因为我需要更改状态,解决方案是使变量成为全局变量,您应该将其添加到您的答案中。谢谢你:沉闷?这很奇怪,即使我看到你的监听器被标记为finalprivate 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);
}