为什么在 GridView 中上下滚动会更改共享首选项中的注册表?



我的问题与此类似。但我不能将这些问题中的解决方案应用于我的情况。

我的情况如下:我有 GridView 仅由复选框组成。我在适配器的getView方法中设置了setOnCheckedChangeListener,这样一旦CheckBox的状态发生更改,复选框的当前状态就会注册到SharedPreferences。在getView中,我也正在阅读复选框的当前状态并将其状态设置为这样。但是,向下滚动和向上滚动会使复选框未选中。

如何解决这个问题? 这是我的自定义适配器:

public class KnowledgeItemAdapter extends ArrayAdapter<KnowledgeItem> {
private String currentKey;
public KnowledgeItemAdapter(Activity context, ArrayList<KnowledgeItem> knowledgeItems){
super(context, 0, knowledgeItems);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View knowledgeItemView = convertView;
if (knowledgeItemView == null){
knowledgeItemView = LayoutInflater.from(getContext()).inflate(R.layout.item_knowledge, parent, false);
}
knowledgeItemView.setClickable(true);
knowledgeItemView.setFocusable(true);
knowledgeItemView.setBackgroundResource(android.R.drawable.menuitem_background);
final KnowledgeItem currentKnowledgeItem = getItem(position);
final CheckBox knowledgeCheckBox = (CheckBox) knowledgeItemView.findViewById(R.id.item_knowledge_check_box);
final SharedPreferences prefs = getContext().getSharedPreferences("com.example.myapplication", Context.MODE_PRIVATE);
currentKey = currentKnowledgeItem.getPrefsKey();
Boolean status = prefs.getBoolean(currentKey, false);
knowledgeCheckBox.setText(currentKnowledgeItem.getText());
knowledgeCheckBox.setChecked(status);
knowledgeCheckBox.setOnCheckedChangeListener( //this);
new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
prefs.edit().putBoolean(currentKnowledgeItem.getPrefsKey(), isChecked).apply();
}
}
);
return knowledgeItemView;
}
}

好的,我终于找到了答案。我已经用onClickListener更改了onCheckedChangeListener。

knowledgeItemView.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("On Click Listener", currentKey);
if(knowledgeCheckBox.isChecked()){
knowledgeCheckBox.setChecked(false);
prefs.edit().putBoolean(currentKey, false).apply();
} else {
knowledgeCheckBox.setChecked(true);
prefs.edit().putBoolean(currentKey, true).apply();
}
}
}
);

并且不要忘记将复选框的可点击 xml 属性更改为 false。否则,单击复选框的事件并查看冲突。

最新更新