java - 为什么在 GridView 中向上和向下滚动会更改 SharedPreferences 中的注册表?

标签 java android

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

我的情况如下:我的 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/

相关文章:

java - 液碱 : link main yaml changelog from test

Android Tv imageCardView 背景/额外内容

java - android:检测设备倾斜角度的主要问题

Android - GridLayout 中的方形 ImageButton

java - JRE系统库在Eclipse中总是未绑定(bind)? (: "Launching Main".模型不适用于helloWorld期间发生内部错误)

java - Android开发中Java如何存储程序逻辑数据?

java - 使用Weka将文件拆分为测试文件和训练文件

java - 使用 setString() 从 String 转换为 Clob 不起作用

Android - Google+ 登录

android - 非静态如何在自定义微调器中使用 "getSystemService"