数据库未显示在 RecyclerView 中

问题描述 投票:0回答:1

几天前我没有遇到这个问题,我可以将新条目添加到膳食数据库/列表中,它将添加到已创建的膳食列表中。在很长一段时间里,我都很难从列表中删除,但当我终于让删除按钮起作用时,我意识到我无法再添加到列表中。或者那就是它看起来的样子。当我检查从数据下载的 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();
    }
}
java android android-recyclerview
1个回答
0
投票

您在 Activity 和适配器之间共享相同的

ratedDishes
实例。

因此,在

retrieveRatedDishesFromDatabase
中,
ratedDishes
被清除并填充来自数据库的项目。接下来,
ratedDishes
作为
updateData
传递到
newData
中的适配器。在该方法中,您执行
ratedDishes.clear()
操作,它指向同一个实例 (
newData
)。

因此,要么为适配器使用一组不同的项目:

private ArrayList<RatedDish> ratedDishes;
...
    
public RatedDishAdapter(Context context) {
  this.ratedDishes = new ArrayList<RatedDish>();
  ...
}

或仅在单个位置(活动或适配器)更新项目

© www.soinside.com 2019 - 2024. All rights reserved.