java - 为什么在 GridView 中上下滚动会更改 SharedPreferences 中的注册表?
问题描述
我的问题类似于this和this。但我无法将这些问题的解决方案应用于我的案例。
我的情况如下:我的 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;
}
}
解决方案
好的,我终于找到了答案。我已经用 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。否则单击复选框事件并查看冲突。
推荐阅读
- python - 解压文件时出现“错误0x80070057:参数不正确”
- c# - Changing the player's position in Update() or FixedUpdate() method?
- python - 如何在不进入网页的情况下单击网页按钮
- python-3.x - 如何根据其他单词的存在从字符串中提取某些单词?
- reactjs - 如何使胜利原生光标容器x和y轴线只与图形上的点相交而不与触摸点相交
- sql - LINQ to Entities 返回空列表,但它的 SQL 等效返回结果
- bash - 查找单行文件并将它们移动到子文件夹
- javascript - 内联事件处理程序中的作用域名称是如何创建的?这个机制在哪里记录?
- camel-http - Restlet 错误:“无法运行以下服务器端任务:sun.net.httpserver.ServerImpl$Exchange@56d26222”
- node.js - 如何在同一个 handler.js 文件中调用另一个 AWS 函数?并附加查询字符串参数?