我有一個 recyclerview,我在 recyclerview 中顯示城市名稱,當我在 recyclerview 中長按城市名稱時,我想洗掉我單擊的城市。
除第一個和最后一個城市外,洗掉作業成功。當我想洗掉最后一個城市和第一個城市時,它正在從我的回收站視圖中洗掉,但它沒有從我的 sql 資料庫中洗掉,它顯示我的吐司訊息“出了點問題”。
回來再看recyclerview的時候,名字和姓氏都沒有刪掉。當我想再次洗掉它時,它會出現此錯誤
空物件參考上的“Adapter.notifyDataSetChanged()”
我的配接器類
public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> {
ArrayList<City> arrayList;
Context context;
SQLiteDatabase db ;
Cursor cursor;
int id;
public Adapter(ArrayList<City> arrayList ,Context context ){
this.arrayList = arrayList;
this.context = context;
db = context.openOrCreateDatabase("City",MODE_PRIVATE,null);
Intent intent = ((Activity) context).getIntent();
id = intent.getIntExtra("citId", 0);
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
RecyclerviewRowBinding recyclerviewRowBinding =
RecyclerviewRowBinding.inflate(
LayoutInflater.from(parent.getContext()),
parent,
false);
return new MyViewHolder(recyclerviewRowBinding);
}
@Override
public void onBindViewHolder(@NonNull Adapter.MyViewHolder holder, int position) {
holder.binding.MytxtCities.setText(arrayList.get(position).cityName);
/*when i long click it does the deletion here*/
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setIcon(R.drawable.warningicon);
builder.setMessage("Are you sure that you want to delete " arrayList.get(position).cityName);
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
arrayList.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position,arrayList.size());
cursor = db.rawQuery("select * from city where id=?",new String[]{String.valueOf(id)});
Result(cursor);
}
}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).show();
return true;
}
});
holder.itemView.setOnClickListener(v -> {
Intent intent = new Intent(holder.itemView.getContext(),MainActivity.class);
intent.putExtra("citId",arrayList.get(position).id);
holder.itemView.getContext().startActivity(intent);
});
}
private void Result(Cursor cursor){
if(cursor.getCount() > 0){
db.delete("City","id=?",new String[]{String.valueOf(id)});
notifyDataSetChanged();
}
else{
Toast.makeText(context,"something went wrong !",Toast.LENGTH_LONG).show();
}
}
@Override
public int getItemCount() {
return arrayList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView Mytxt_cities;
private RecyclerviewRowBinding binding;
public MyViewHolder(@NonNull RecyclerviewRowBinding binding) {
super(binding.getRoot());
this.binding = binding;
Mytxt_cities = itemView.findViewById(R.id.Mytxt_cities);
}
}
}
我的 Recyclerview 類是城市類
public class cities extends AppCompatActivity {
RecyclerView recyclerView ;
ArrayList<City> cityArrayList;
Adapter cityadapter;
ImageView cities_back_icon;
public void init(){
cities_back_icon = findViewById(R.id.Id_cities_back_icon);
cities_back_icon_click_register();
cityArrayList = new ArrayList<>();
recyclerView = findViewById(R.id.recyclerview_id);
SQLGet_Data();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cities);
init();
}
private void cities_back_icon_click_register(){
cities_back_icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(cities.this, MainActivity.class);
startActivity(intent);
}
});
}
private void SQLGet_Data(){
try {
SQLiteDatabase sqLiteDatabase = this.openOrCreateDatabase("City",MODE_PRIVATE,null);
Cursor cursor = sqLiteDatabase.rawQuery("SELECT*FROM city",null);
int idIx = cursor.getColumnIndex("id");
int nameIx = cursor.getColumnIndex("cityname");
while(cursor.moveToNext()){
String cityname = cursor.getString(nameIx);
int id = cursor.getInt(idIx);
City city = new City(cityname,id);
cityArrayList.add(city);
}
cityadapter.notifyDataSetChanged(); <--- There is an error in this code
cursor.close();
}
catch (Exception e ){
e.printStackTrace();
}
/*---------------------- set recyclerview-----------------------------*/
cityadapter = new Adapter(cityArrayList,this);
recyclerView.setAdapter(cityadapter);
recyclerView.setLayoutManager(new LinearLayoutManager(cities.this));
/*------- We drew a line between the data in the recyclerview ------*/
DividerItemDecoration dividerItemDecoration = new
DividerItemDecoration(recyclerView.getContext(),
DividerItemDecoration.VERTICAL);
Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),
R.drawable.custom_divider);
dividerItemDecoration.setDrawable(drawable);
recyclerView.addItemDecoration(dividerItemDecoration);
}
}
所以我想簡單地問一下我該如何解決這個錯誤,以及如何同時從 recyclerview 和資料庫中洗掉資料,因為有時 recyclerview 中資料的 id 和 sql lite 資料庫中的 id 可以與眾不同。
uj5u.com熱心網友回復:
您的問題是cityAdapter在錯誤點尚未實體化,因此為空。稍后您將其實體化:-
cityadapter = new Adapter(cityArrayList,this);
您可以在例如之前移動實體化
private void SQLGet_Data(){
cityadapter = new Adapter(cityArrayList,this);
try {
....
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/382486.html
