java - 如何在`OnClick`方法中使用`Arraylist`?
问题描述
当我尝试使用ArrayList
, and StringBuffer
inOnClick
方法时,Android Studio 希望我将它们更改为final
. 但是当我这样做时,我只能将最后插入的元素保留在ArrayList
.
SharedPreferences sp = mContext.getSharedPreferences("checked",Context.MODE_PRIVATE);
final SharedPreferences.Editor e=sp.edit();
final ArrayList<Integer> sharedP= new ArrayList<>();
final String word = words.get(position).getMean();
final int id= words.get(position).getId();
final StringBuffer str= new StringBuffer("");
holder.rowText.setText(word);
holder.rowText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (holder.rowText.isChecked()) {
sharedP.remove(sharedP.indexOf(id));
holder.rowText.setCheckMarkDrawable(null);
holder.rowText.setChecked(false);
} else {
sharedP.add(id);
holder.rowText.setCheckMarkDrawable(R.drawable.ic_check_black_24dp);
holder.rowText.setChecked(true);
}
for(int i=0;i<sharedP.size();i++){
Log.e("sharedpreference1",sharedP.get(i).toString());
str.append(sharedP.get(i));
}
e.putString("str", str.toString());
e.commit();
}
});
更新代码
SharedPreferences sp = mContext.getSharedPreferences("checked",Context.MODE_PRIVATE);
e=sp.edit();
sharedP= new ArrayList<>();
word = words.get(position).getMean();
Log.e("getMean",word);
id= words.get(position).getId();
str= new StringBuffer("");
holder.rowText.setText(word);
holder.rowText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (holder.rowText.isChecked()) {
sharedP.remove(sharedP.indexOf(word));
flag=false;
holder.rowText.setCheckMarkDrawable(null);
holder.rowText.setChecked(false);
} else {
sharedP.add(word);
flag=true;
Log.e("deneme",word);
holder.rowText.setCheckMarkDrawable(R.drawable.ic_check_black_24dp);
holder.rowText.setChecked(true);
}
str.delete(0,str.length());
for(int i=0;i<sharedP.size();i++){
Log.e("sharedpreference1",sharedP.get(i).toString());
str.append(sharedP.get(i));
str.append(".");
}
if(flag==false){
e.remove("str");
e.commit();
}
Log.e("size",str.toString());
e.putString("str", str.toString());
e.remove("set");
e.commit();
}
});
但它仍然返回 Array 的最后一个元素
解决方案
您必须在该方法之外声明变量。
private SharedPreferences.Editor e;
private ArrayList<Integer> sharedP= new ArrayList<>();
private String word = null;
private int id= 0;
private StringBuffer str = null;
然后:
e=sp.edit();
sharedP= new ArrayList<>();
word = words.get(position).getMean();
id= words.get(position).getId();
str= new StringBuffer("");
推荐阅读
- sql - 非常有趣的不那么动态的 sql 问题 - 根据指定所需列的单独表动态选择列值
- python - 来自请求内部的 Python requests.get() 将无法完成
- node.js - uri图像源反应原生不起作用
- react-native - 是否有必要在 react native 项目中忽略 .expo-shared 文件夹?
- php - OPcache 实习字符串缓冲区大小低于“opcache.interned_strings_buffer”
- jsf - PrimeFaces Datatable 总是选择第一个元素
- c# - 如何使用 C# 从传入的 API 日期添加三个月?
- vue.js - 使用 TailwindCSS 时“需要 js”是什么意思?
- wordpress - 如何通过 wordpress 桥页面将 URL 参数从源传递到目标?
- python - python中是否有与perl的Forks::Super等价的东西?