我的问题类似于this和 this 。但我无法将这些问题的解决方案应用到我的案例中。
我的情况如下:我的 GridView 仅由复选框组成。我在 Adapter 的 getView 方法中设置了 setOnCheckedChangeListener,以便一旦 CheckBox 的状态发生更改,CheckBox 的当前状态就会注册到 SharedPreferences。在 getView 中,我正在读取 CheckBox 的当前状态并将其状态设置为如此。然而,向下和向后滚动会使选中的框取消选中。
如何解决这个问题? 这是我的自定义适配器:
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;
}
}
最佳答案
好吧,我终于找到答案了。我已将 onCheckedChangeListener 更改为 onClickListener。
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。否则复选框的点击事件与 View 冲突。
关于java - 为什么在 GridView 中向上和向下滚动会更改 SharedPreferences 中的注册表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59431386/