Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android notifyItemRemoved()不更新我的回收器视图,但从数组列表中删除数据_Android_Android Recyclerview - Fatal编程技术网

Android notifyItemRemoved()不更新我的回收器视图,但从数组列表中删除数据

Android notifyItemRemoved()不更新我的回收器视图,但从数组列表中删除数据,android,android-recyclerview,Android,Android Recyclerview,我使用的是回收者视图。我使用自定义接口在其上设置了OnLongClickListener()。一切正常,但当我长按该行时,应用程序崩溃,出现Java.lang.IndexOutOfBoundsException。在调试时,我发现我的数组列表的数据在长按时被删除,但回收器视图没有得到更新。 这是我的密码 MainActivity.java package com.raunak.alarmdemo4; import androidx.appcompat.app.AppCompatActivity;

我使用的是回收者视图。我使用自定义接口在其上设置了OnLongClickListener()。一切正常,但当我长按该行时,应用程序崩溃,出现Java.lang.IndexOutOfBoundsException。在调试时,我发现我的数组列表的数据在长按时被删除,但回收器视图没有得到更新。 这是我的密码

MainActivity.java

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