几天前我没有遇到这个问题,我可以将新条目添加到膳食数据库/列表中,它将添加到已创建的膳食列表中。在很长一段时间里,我都很难从列表中删除,但当我终于让删除按钮起作用时,我意识到我无法再添加到列表中。或者那就是它看起来的样子。当我检查从数据下载的 sql 文件中的数据库时,它显示每个新输入仍在更新到数据库。但目前 RecyclerView 仅显示空白屏幕。你能帮我诊断一下问题吗?
我在适配器中尝试了不同的notifyDataSetChange()变体,但它仍然不是答案。我认为如果数据正在更新,它应该显示在列表中,但显然没有。
我相信问题出在我的 MainActivity 或额定盘适配器中
这是我的 MainActivity.java:
package com.example.restaurantrater;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
EditText Restaurant_name;
EditText Restaurant_address;
Button save_btn;
private RestaurantDBhelper dbHelper;
private RecyclerView recyclerView;
private RatedDishAdapter adapter;
private static int restIDcount = 0;
private ArrayList<RatedDish> ratedDishes;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new RestaurantDBhelper(this);
Restaurant_name = findViewById(R.id.restaurant_name);
Restaurant_address = findViewById(R.id.streetaddress);
save_btn = findViewById(R.id.save_dish);
save_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String nrestaurant_n = Restaurant_name.getText().toString();
String nrestaurant_a = Restaurant_address.getText().toString();
restIDcount++;
// Insert restaurant details into the database
long result = dbHelper.insertRestaurant(nrestaurant_n, nrestaurant_a);
if (result != -1) {
// Restaurant inserted successfully, navigate to DishRater
Intent intent = new Intent(MainActivity.this, DishRater.class);
intent.putExtra("restaurantid", restIDcount);
startActivity(intent);
} else {
// Failed to insert restaurant
// Handle error, show toast or log error
}
}
});
// RecyclerView setup
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
// Initialize adapter for RecyclerView
ratedDishes = new ArrayList<>();
adapter = new RatedDishAdapter(ratedDishes, this);
recyclerView.setAdapter(adapter);
// Set up click listener for delete actions in the adapter
adapter.setOnItemClickListener(new RatedDishAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
// Handle item click if needed
}
@Override
public void onDeleteClick(int position) {
RatedDish deletedDish = ratedDishes.get(position);
boolean isDeleted = dbHelper.deleteDish(deletedDish.getId());
if (isDeleted) {
Toast.makeText(MainActivity.this, "Dish deleted successfully", Toast.LENGTH_SHORT).show();
// Remove the deleted item from the RecyclerView
ratedDishes.remove(position);
adapter.notifyItemRemoved(position);
} else {
Toast.makeText(MainActivity.this, "Failed to delete dish", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
protected void onResume() {
super.onResume();
// Retrieve list of rated meals from the database
retrieveRatedDishesFromDatabase();
// Update the adapter with the new list of rated dishes
adapter.updateData(ratedDishes);
}
private void retrieveRatedDishesFromDatabase() {
// Call getAllRatedDishes() method from RestaurantDBhelper
ratedDishes.clear();
ratedDishes.addAll(dbHelper.getAllRatedDishes());
adapter.updateData(ratedDishes);
}
}
This is my RatedDishAdapter.java: package com.example.restaurantrater;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class RatedDishAdapter extends RecyclerView.Adapter<RatedDishAdapter.RatedDishViewHolder> {
private ArrayList<RatedDish> ratedDishes;
private OnItemClickListener clickListener; // Define listener
private Context context; // Add context field
private RestaurantDBhelper dbHelper; // Add dbHelper field
public RatedDishAdapter(ArrayList<RatedDish> ratedDishes, Context context) {
this.ratedDishes = ratedDishes;
this.context = context; // Initialize context
this.dbHelper = new RestaurantDBhelper(context); // Initialize dbHelper
}
public interface OnItemClickListener {
void onItemClick(int position);
void onDeleteClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.clickListener = listener;
}
@NonNull
@Override
public RatedDishViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_rated_dish, parent, false);
return new RatedDishViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull RatedDishViewHolder holder, int position) {
RatedDish ratedDish = ratedDishes.get(position);
holder.textDishName.setText(ratedDish.getName());
holder.textRating.setText(String.valueOf(ratedDish.getRating()));
// Set click listener for the delete button
holder.deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (clickListener != null) {
int position = holder.getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
clickListener.onDeleteClick(position);
}
}
}
});
}
@Override
public int getItemCount() {
return ratedDishes.size();
}
public class RatedDishViewHolder extends RecyclerView.ViewHolder {
public TextView textDishName;
public TextView textRating;
public Button deleteButton;
public RatedDishViewHolder(@NonNull View itemView) {
super(itemView);
textDishName = itemView.findViewById(R.id.textViewDishName);
textRating = itemView.findViewById(R.id.textViewRating);
deleteButton = itemView.findViewById(R.id.buttonDelete);
// Set click listener for the delete button
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (clickListener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
clickListener.onDeleteClick(position);
}
}
}
});
// Set click listener on the item view
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clickListener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
clickListener.onItemClick(position);
}
}
}
});
}
}
// Update the data in the adapter
public void updateData(ArrayList<RatedDish> newData) {
ratedDishes.clear();
ratedDishes.addAll(newData);
notifyDataSetChanged();
}
}
您在 Activity 和适配器之间共享相同的
ratedDishes
实例。
因此,在
retrieveRatedDishesFromDatabase
中,ratedDishes
被清除并填充来自数据库的项目。接下来,ratedDishes
作为updateData
传递到newData
中的适配器。在该方法中,您执行 ratedDishes.clear()
操作,它指向同一个实例 (newData
)。
因此,要么为适配器使用一组不同的项目:
private ArrayList<RatedDish> ratedDishes;
...
public RatedDishAdapter(Context context) {
this.ratedDishes = new ArrayList<RatedDish>();
...
}
或仅在单个位置(活动或适配器)更新项目