我的问题是我有一个回收器 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/