首页 > 解决方案 > 为什么在 GridView 中上下滚动会更改 SharedPreferences 中的注册表?

问题描述

我的问题类似于thisthis。但我无法将这些问题的解决方案应用于我的案例。

我的情况如下:我的 GridView 仅包含 CheckBoxes。我在我的 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;
    }

}

标签: javaandroid

解决方案


好的,我终于找到了答案。我已经用 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。否则单击复选框事件并查看冲突。


推荐阅读