Rhys Owain Evans Ответов: 1

Отображение результатов поиска sqlite в recyclerview


Я получаю следующую ошибку :

Ява.яз.NullPointerException: попытка вызвать виртуальный метод 'void android.widget.Виджет TextView.помощью setText(Ява.яз.CharSequence)' по ссылке на нулевой объект

Это происходит на этой линии
держатель.myTextView.помощью setText(itemRecipe.вам(должность).toString());

Я прошел через несколько шагов по устранению неполадок для этого и не уверен, что еще попробовать или если база данных даже работает, причина, по которой я хочу, чтобы это работало.

Что я уже пробовал:

RecyclerAdapter
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

    private List<RecipeList> itemRecipe;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;

    // data is passed into the constructor
    RecyclerViewAdapter(Context context, List<RecipeList> data) {
        this.mInflater = LayoutInflater.from(context);
        this.itemRecipe = data;
    }

    // inflates the row layout from xml when needed
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.fragment_item, parent, false);
        return new ViewHolder(view);
    }

    // binds the data to the TextView in each row
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.myTextView.setText(itemRecipe.get(position).toString());

    }

    // total number of rows
    @Override
    public int getItemCount() {
        return itemRecipe.size();
    }


    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView myTextView;

        ViewHolder(View itemView) {
            super(itemView);
            myTextView = itemView.findViewById(R.id.listIngredient);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }


    // allows clicks events to be caught
    void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    // parent activity will implement this method to respond to click events
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}


Основной класс

public class Recipe extends MainActivity {

    TabLayout tabLayout;
    ImageView recipeImage;
    TextView descriptionText, courseText, servingsText, costText, caloriesText, methodText;
    RecyclerView listIngredient;
    SQLiteDatabase db;
    String search_name;
    Cursor c;
    RecyclerViewAdapter adapterRecipe;
    List<RecipeList> itemRecipe = new ArrayList<>();

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recipe);
        //search_name = getIntent().getStringExtra("NAME");
        search_name = "Speedy chicken couscous";

        loadRecipe();
        //recyclerview Recipe
        adapterRecipe = new RecyclerViewAdapter(this, itemRecipe);
        listIngredient = findViewById(R.id.listIngredient);

        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this,
                LinearLayoutManager.VERTICAL, false);
        listIngredient.setLayoutManager(mLayoutManager);
        listIngredient.setItemAnimator(new DefaultItemAnimator());
        listIngredient.setAdapter(adapterRecipe);

    }
    public void loadRecipe() {
        itemRecipe.clear();
        db = (new DatabaseManager(this).getWritableDatabase());
        String RECIPE_SEARCH = " SELECT A.recipe, A.ingredient_quantity, B.measurement_name, B.ingredient_name, B.description " +
                "FROM " + DatabaseManager.TABLE_QUANTITY + " AS A JOIN " + DatabaseManager.TABLE_INGREDIENTS +
                " AS B ON A.ingredient = B.ingredient_name";
        String selectQuery = "";
        selectQuery = RECIPE_SEARCH + " WHERE A.recipe LIKE ?";
        c = db.rawQuery(selectQuery, new String[]{"%" + search_name + "%"});
        if (c.moveToFirst()) {
            do {
                RecipeList recipeList = new RecipeList();
                recipeList.setRecipe(c.getString(c.getColumnIndex("recipe")));
                recipeList.setIngredient_amount(c.getString(c.getColumnIndex("ingredient_quantity")));
                recipeList.setMeasurement_name(c.getString(c.getColumnIndex("measurement_name")));
                recipeList.setIngredient_name(c.getString(c.getColumnIndex("ingredient_name")));
                recipeList.setDescription(c.getString(c.getColumnIndex("description")));
                itemRecipe.add(recipeList);
            } while (c.moveToNext());
            c.close();
        }

    }
}


Класс RecipeList

public class RecipeList {

    private Integer id;
    private Double ingredient_quantity;
    private String recipe;
    private String measurement_name;
    private String ingredient_name;
    private String description;
    private String ingredient_amount = String.valueOf(ingredient_quantity);
    public RecipeList(){

    }

    public RecipeList(String recipe, String ingredient_amount, String measurement_name, String ingredient_name, String description) {

        this.recipe = recipe;
        this.ingredient_amount = ingredient_amount;
        this.measurement_name = measurement_name;
        this.ingredient_name = ingredient_name;
        this.description = description;
    }

    public String getRecipe() {
        return recipe;
    }

    public void setRecipe(String recipe) {
        this.recipe = recipe;
    }

    public String getIngredient_amount() {
        return ingredient_amount;
    }

    public void setIngredient_amount(String ingredient_amount) {
        this.ingredient_amount = ingredient_amount;
    }

    public String getMeasurement_name() {
        return measurement_name;
    }

    public void setMeasurement_name(String measurement_name) {
        this.measurement_name = measurement_name;
    }

    public String getIngredient_name() {
        return ingredient_name;
    }

    public void setIngredient_name(String ingredient_name) {
        this.ingredient_name = ingredient_name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
    @Override
    public String toString() {
        return "RecipeList{" +
                "id=" + id +
                ", ingredient_quantity=" + ingredient_quantity +
                ", recipe='" + recipe + '\'' +
                ", measurement_name='" + measurement_name + '\'' +
                ", ingredient_name='" + ingredient_name + '\'' +
                ", description='" + description + '\'' +
                ", ingredient_amount='" + ingredient_amount + '\'' +
                '}';
    }
}

David Crow

Это не имеет никакого отношения к базе данных. Это имеет самое непосредственное отношение к myTextView существование null- Вы уже вступили в игру? ViewHolder конструктор, чтобы увидеть, что возвращается из findViewById()?

Я ничего не вижу try/catch блоки в вашем коде. Это намеренно?

Rhys Owain Evans

Я очень новичок в этом и не уверен, что вы имеете в виду, где будут блоки try/catch?

David Crow

Вокруг кода, для которого может быть создано исключение.

Rhys Owain Evans

Где бы я поместил их в этом коде? Кроме того, как мне посмотреть, что возвращается функцией findViewById()?

David Crow

- А куда я их помещу в этом коде?"

Видеть здесь.

"Кроме того, как мне посмотреть, что возвращается findViewById()?"

С помощью отладчика.

1 Ответов

Рейтинг:
12

Sandeep Mewara

Ссылка: Как разрешить java.lang.Исключение NullPointerException[^]

Цитата:
На языке Java - java.lang.Исключение NullPointerException возникает при обращении к ссылочной переменной (или снятии ссылки) и не указывает ни на один объект. Эта ошибка может быть устранена с помощью блока try-catch или условия if-else, чтобы проверить, является ли ссылочная переменная нулевой, прежде чем разыменовать ее.

В вашем случае я бы предложил проверить наличие null, прежде чем преобразовывать его в строку для использования.
// binds the data to the TextView in each row
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    if(itemRecipe.get(position) != null)
    {
      holder.myTextView.setText(itemRecipe.get(position).toString());
    }
}

С помощью debugger, вы сможете узнать, что именно является нулем. Приведенный выше код утверждает, что itemRecipe не является нулевым, но значение в заданной позиции в нем есть. Если он окажется, что itemReceipe равен нулю, используйте его в качестве условия.


Rhys Owain Evans

Спасибо, я попробую позже. Я очень новичок в этом и еще не использовал отладчик, но пока не знаю, как это сделать.