如何避免`textData.setSelected(!textData.isSelected());`导致的无限递归问题?
时间: 2024-10-24 11:04:54 浏览: 20
为了避免`textData.setSelected(!textData.isSelected());`可能导致的无限递归问题,可以在`onClick`方法中添加一个条件判断。通常的做法是在进入`onClick`之前先检查当前的选择状态,如果已经是反向状态(比如本来是选中现在又要变成未选中,或者相反),则跳过这次选择操作,不执行`setSelected`方法。例如:
```java
@Override
public void onClick(View view) {
boolean isSelected = textData.isSelected();
if (!isSelected) { // 防止连续两次快速点击导致无限递归
hide();
if (mOperationHelper != null) {
int pos = (int) textData.getTag();
mOperationHelper.setTask(pos);
if (pos == 0) {
textData.setSelected(!isSelected);
}
}
}
}
```
这样,只有在用户真正改变选择意图(如第一次点击选中,再次点击取消)时,才会执行相关的操作。
相关问题
if (mStickerObservable.getEmojiMode()) { bindingHolder.binding.setVariable(BR.emoji_item, mStickerObservable.getEmojiList().get(position)); bindingHolder.binding.emoji.setSelected(mEmojiFocusIndex == position); } else { bindingHolder.binding.setVariable(BR.text_item, mStickerObservable.getTextDrawableList().get(position)); bindingHolder.binding.text.setSelected(mTextFocusIndex == position); }
这段代码是一个条件语句,根据`mStickerObservable`中的`emojiMode`属性的值来决定执行不同的逻辑。
如果`emojiMode`为真(即为true),则会执行以下操作:
- 通过`mStickerObservable`的`getEmojiList()`方法获取一个表情列表,并将列表中的某个元素绑定到`bindingHolder.binding`上的`emoji_item`变量上。
- 设置`bindingHolder.binding`上的`emoji`视图为选中状态,当且仅当`mEmojiFocusIndex`的值等于当前位置(position)时。
如果`emojiMode`为假(即为false),则会执行以下操作:
- 通过`mStickerObservable`的`getTextDrawableList()`方法获取一个文本绘制列表,并将列表中的某个元素绑定到`bindingHolder.binding`上的`text_item`变量上。
- 设置`bindingHolder.binding`上的`text`视图为选中状态,当且仅当`mTextFocusIndex`的值等于当前位置(position)时。
mLayoutTab0.setSelected(false); mLayoutTab1.setSelected(true); mLayoutTab2.setSelected(false); interruptCountdown(); BaiduNaviManagerFactory.getRouteResultManager().selectRoute(1); BaiduNaviManagerFactory.getRouteResultManager().fullView(); mRouteList.clear(); mRouteList.addAll(mRouteDetails.get(1)); mResultAdapter.notifyItemChanged(1); 以上代码,当mRoutePlanItems为空时,用户点击,会造成程序闪退崩溃,请帮我改善一下
在这段代码中,我们需要检查`mRoutePlanItems`是否为空,如果为空则不执行这个代码块。我们可以使用`if`语句来实现这一点:
```
if (mRoutePlanItems != null && !mRoutePlanItems.isEmpty()) {
mLayoutTab0.setSelected(false);
mLayoutTab1.setSelected(true);
mLayoutTab2.setSelected(false);
interruptCountdown();
BaiduNaviManagerFactory.getRouteResultManager().selectRoute(1);
BaiduNaviManagerFactory.getRouteResultManager().fullView();
mRouteList.clear();
mRouteList.addAll(mRouteDetails.get(1));
mResultAdapter.notifyItemChanged(1);
} else {
// do something when mRoutePlanItems is empty
}
```
这样,当`mRoutePlanItems`为空时,程序将不会执行这段代码,而是执行`else`语句中的代码块。你可以根据自己的需求来编写`else`语句中的代码。
阅读全文