Android notifyItemRemoved()不更新我的回收器视图,但从数组列表中删除数据
我使用的是回收者视图。我使用自定义接口在其上设置了OnLongClickListener()。一切正常,但当我长按该行时,应用程序崩溃,出现Java.lang.IndexOutOfBoundsException。在调试时,我发现我的数组列表的数据在长按时被删除,但回收器视图没有得到更新。 这是我的密码 MainActivity.javaAndroid notifyItemRemoved()不更新我的回收器视图,但从数组列表中删除数据,android,android-recyclerview,Android,Android Recyclerview,我使用的是回收者视图。我使用自定义接口在其上设置了OnLongClickListener()。一切正常,但当我长按该行时,应用程序崩溃,出现Java.lang.IndexOutOfBoundsException。在调试时,我发现我的数组列表的数据在长按时被删除,但回收器视图没有得到更新。 这是我的密码 MainActivity.java package com.raunak.alarmdemo4; import androidx.appcompat.app.AppCompatActivity;
package com.raunak.alarmdemo4;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Switch;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.raunak.alarmdemo4.Activities.AddAlarm;
import com.raunak.alarmdemo4.Adapters.AlarmAdapter;
import com.raunak.alarmdemo4.HelperClasses.AlarmsDBhelperClass;
import com.raunak.alarmdemo4.Interfaces.AlarmRecyclerViewInterface;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements AlarmRecyclerViewInterface {
FloatingActionButton mAlarmAddButton;
RecyclerView mRecyclerView;
SQLiteDatabase db;
AlarmsDBhelperClass mAlarmsDBhelperClass;
ArrayList<String> nameArrayList,modeArrayList,repeatArrayList,hoursArrayList,minArrayList;
Switch mSwitch;
AlarmAdapter alarmAdapter = new AlarmAdapter(hoursArrayList,minArrayList,modeArrayList,repeatArrayList,nameArrayList,this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//Initializing RecyclerView & DatabaseHelperClass and the FAB button
mAlarmsDBhelperClass = new AlarmsDBhelperClass(getApplicationContext());
mAlarmAddButton = findViewById(R.id.btnAlarmADD);
mRecyclerView = findViewById(R.id.alarmList);
mSwitch = findViewById(R.id.switchONOFF);
//Initializing ArrayList
nameArrayList = new ArrayList<>();
modeArrayList = new ArrayList<>();
repeatArrayList = new ArrayList<>();
hoursArrayList = new ArrayList<>();
minArrayList = new ArrayList<>();
DividerItemDecoration itemDecoration = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
mRecyclerView.addItemDecoration(itemDecoration);
//Getting a writable reference of the Database.
db = mAlarmsDBhelperClass.getWritableDatabase();
//getAlarm(db);
getAlarm(db);
mAlarmAddButton.setImageResource(R.drawable.addalarm);
mAlarmAddButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent mIntent = new Intent(getApplicationContext(), AddAlarm.class);
startActivity(mIntent);
}
});
/* mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(b){
Toast.makeText(getApplicationContext(),"Checked !",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(),"Unchecked !",Toast.LENGTH_SHORT).show();
}
}
});*/
AlarmAdapter alarmAdapter = new AlarmAdapter(hoursArrayList,minArrayList,modeArrayList,repeatArrayList,nameArrayList,this);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
mRecyclerView.setAdapter(alarmAdapter);
mRecyclerView.setHasFixedSize(true);
}
public void getAlarm(SQLiteDatabase db) {
Cursor cursor = db.rawQuery("SELECT * FROM alarms", new String[]{});
cursor.moveToFirst();
if (cursor != null) {
do {
nameArrayList.add(cursor.getString(2));
modeArrayList.add(cursor.getString(3));
repeatArrayList.add(cursor.getString(4));
hoursArrayList.add(Integer.toString(cursor.getInt(5)));
minArrayList.add(Integer.toString(cursor.getInt(6)));
} while (cursor.moveToNext());
}
cursor.close();
}
@Override
public void onItemClick(int position) {
Toast.makeText(this, "Alarm Clicked !", Toast.LENGTH_SHORT).show();
}
@Override
public void onLongItemClick(int position) {
hoursArrayList.remove(position);
Log.d("d",""+position);
alarmAdapter.notifyItemRemoved(position);
Toast.makeText(this, ""+hoursArrayList.size(), Toast.LENGTH_SHORT).show();
}
}
谢谢你的帮助 您正在onCreate中声明和分配不同的适配器。从那里删除声明并在那里初始化它
AlarmAdapter alarmAdapter = new AlarmAdapter(hoursArrayList,minArrayList,modeArrayList,repeatArrayList,nameArrayList,this);
为了提高效率,您需要改进代码,创建一个模型类,而不是声明每个参数的arrrayList。您正在onCreate中声明和分配不同的适配器。从那里删除声明并在那里初始化它
AlarmAdapter alarmAdapter = new AlarmAdapter(hoursArrayList,minArrayList,modeArrayList,repeatArrayList,nameArrayList,this);
为了提高效率,您需要改进代码,创建一个模型类,而不是声明每个参数的arraylist。您还应该从nameArrayList和适配器中删除该元素:
@Override
public int getItemCount() {
return nameArrayList.size(); //This return a number that is higher than the number of elements
}
您应该修改MainActivity字段:
FloatingActionButton mAlarmAddButton;
RecyclerView mRecyclerView;
SQLiteDatabase db;
AlarmsDBhelperClass mAlarmsDBhelperClass;
ArrayList<String> nameArrayList,modeArrayList,repeatArrayList,hoursArrayList,minArrayList;
Switch mSwitch;
AlarmAdapter alarmAdapter = new AlarmAdapter(hoursArrayList,minArrayList,modeArrayList,repeatArrayList,nameArrayList,this);
//This line has nosense, if you re-declare another alarmAdapter in the onCreate
FloatingActionButton mAlarmAddButton;
回收视图mRecyclerView;
sqlitedb数据库;
报警SDBHELPERCLASS mAlarmsDBhelperClass;
ArrayList名称ArrayList、modeArrayList、repeatArrayList、hoursArrayList、minArrayList;
开关;
AlarmAdapter AlarmAdapter=新的AlarmAdapter(小时ArrayList、minArrayList、modeArrayList、repeatArrayList、nameArrayList、this);
//如果在onCreate中重新声明另一个alarmAdapter,则此行具有nosense
您还应该从nameArrayList和适配器中删除该元素:
@Override
public int getItemCount() {
return nameArrayList.size(); //This return a number that is higher than the number of elements
}
您应该修改MainActivity字段:
FloatingActionButton mAlarmAddButton;
RecyclerView mRecyclerView;
SQLiteDatabase db;
AlarmsDBhelperClass mAlarmsDBhelperClass;
ArrayList<String> nameArrayList,modeArrayList,repeatArrayList,hoursArrayList,minArrayList;
Switch mSwitch;
AlarmAdapter alarmAdapter = new AlarmAdapter(hoursArrayList,minArrayList,modeArrayList,repeatArrayList,nameArrayList,this);
//This line has nosense, if you re-declare another alarmAdapter in the onCreate
FloatingActionButton mAlarmAddButton;
回收视图mRecyclerView;
sqlitedb数据库;
报警SDBHELPERCLASS mAlarmsDBhelperClass;
ArrayList名称ArrayList、modeArrayList、repeatArrayList、hoursArrayList、minArrayList;
开关;
AlarmAdapter AlarmAdapter=新的AlarmAdapter(小时ArrayList、minArrayList、modeArrayList、repeatArrayList、nameArrayList、this);
//如果在onCreate中重新声明另一个alarmAdapter,则此行具有nosense
非常感谢,先生!但是我意识到问题只在于getItemCount(),所以在getItemCount()中,我替换了nameArraylist.size();使用hoursArrayList.size();或者我们在主活动的onLongClickListener中删除一个。非常感谢,先生!但是我意识到问题只在于getItemCount(),所以在getItemCount()中,我替换了nameArraylist.size();使用hoursArrayList.size();或者在主活动的onLongClickListener中删除一个。我是初学者,但感谢提示,我一定会尝试这个。我是初学者,但感谢提示,我一定会尝试这个。
@Override
public int getItemCount() {
return hoursArrayList.size(); //Or just the first line and modify this
}
FloatingActionButton mAlarmAddButton;
RecyclerView mRecyclerView;
SQLiteDatabase db;
AlarmsDBhelperClass mAlarmsDBhelperClass;
ArrayList<String> nameArrayList,modeArrayList,repeatArrayList,hoursArrayList,minArrayList;
Switch mSwitch;
AlarmAdapter alarmAdapter = new AlarmAdapter(hoursArrayList,minArrayList,modeArrayList,repeatArrayList,nameArrayList,this);
//This line has nosense, if you re-declare another alarmAdapter in the onCreate