如何解决notifyItemChanged(int position) 仅更新 Recyclerview 中的单个项目
for (int i = 0; i < itemname.size(); i++) { // here itemname contains list of names
AlertSensor(itemname.get(i));
}
在 cardview 中存在 3 张卡片。下面的函数工作不正常,只更新了 3 张卡中的最后一张,尽管两者似乎都以类似的方式实现了 userAdapter.notifyItemChanged()。即使使用特定位置值调用 userAdapter.notifyItemChanged(id),该卡正在更新,但在迭代期间,所有卡都没有更新。
private void AlertSensor(final String item)
{
ContentValues values = new ContentValues(); // Saving the values to the local sqlite database
values.put(SecurityDatabaseContract.UserDatabase2.SEC_NAME_COL4,"1");
SecDB.update(SecurityDatabaseContract.UserDatabase2.TABLE_NAME2,values,"address='" + item + "'",null);
String query = "SELECT id FROM sec_table WHERE address='" + item + "'";
Cursor c1 = SecDB.rawQuery(query,null);
if (c1 != null && c1.getCount() != 0) {
while (c1.movetoNext()) {
id = c1.getInt(c1.getColumnIndex("id"));
}
c1.close();
}
alert_position = id;
userAdapter.notifyItemChanged(id);
}
虽然下面的 volley 函数是通过 for 循环将参数传递给函数 AlertSensor() 来调用的,并且正在正确更新所有 3 张卡片。为什么这两个功能的工作方式不同?
private void AlertSensor(final String item) { // The function notifying adapter class
StringRequest stringRequest = new StringRequest(Request.Method.POST,"http://plateau.com/device.PHP",new Response.Listener<String>()
{
int id;
@Override
public void onResponse(String ServerResponse) {
if (ServerResponse.equalsIgnoreCase("1")) {
ContentValues values = new ContentValues();
values.put(SecurityDatabaseContract.UserDatabase2.SEC_NAME_COL4,null);
if (c1 != null && c1.getCount() != 0) {
while (c1.movetoNext()) {
id = c1.getInt(c1.getColumnIndex("id"));
}
c1.close();
}
alert_position = id;
userAdapter.notifyItemChanged(alert_position);
}
}},new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
// Toast.makeText(Security.this,"S1: "+volleyError.toString(),Toast.LENGTH_SHORT).show();
}
})
{
@Override
protected Map<String,String> getParams()
{
Map<String,String> params = new HashMap<>();
params.put("item",item);
return params;
}};
requestQueue.add(stringRequest); // Adding the StringRequest object into requestQueue.
}
在 Adapter 类中的 onBindViewHolder() 方法。该方法的代码负责更新cardview的卡片。
if(position == Security.alert_position) {
holder.state.setText("< Activity Detected >");
holder.state.setTextColor(Color.RED);
holder.cards.setBackgroundColor(0x33FF0000);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。