新 View.OnClickListener () 变灰 -> “No Adapter Attached, skipping Layout” 错误信息

new View.OnClickListener () greyed out ->" No Adapter Attached, skipping Layout" error message

我从 Youtube 教程中复制了回收站视图的代码,但它对我不起作用。 new View.OnClickListener() 显示为灰色,Android Studio 建议用 lambda 替换掉。这是我的代码与教程中的代码的唯一区别...应用程序运行通过,但不显示布局,因为我收到错误消息 E/RecyclerView:未连接适配器;跳过布局.

我该怎么做才能解决这个问题?

这是适配器 class:

package com.example.yourfoodweek;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;

import java.util.ArrayList;

public class MealsRecViewAdapter extends RecyclerView.Adapter<MealsRecViewAdapter.ViewHolder>{
    private static final String TAG = "MealsRecViewAdapter";

    private ArrayList <Food> meals = new ArrayList<>();
    private Context mContext;

    public MealsRecViewAdapter(Context mContext) {
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_meals_list, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Log.d(TAG, "onBindViewHolder: Called");
        holder.txtName.setText(meals.get(position).getName());
        Glide.with(mContext)
                .asBitmap()
                .load(meals.get(position).getImageUrl())
                .into(holder.imgFood);

        holder.parent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick (View v){
                Toast.makeText(mContext, meals.get(position).getName() + "Selected", Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return meals.size();
    }

    public void setMeals(ArrayList<Food> meals) {
        this.meals = meals;
        notifyDataSetChanged();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

        private CardView parent;
        private ImageView imgFood;
        private TextView txtName;
        public ViewHolder(@NonNull View itemView){
            super(itemView);
            parent = itemView.findViewById(R.id.parent);
            txtName = itemView.findViewById(R.id.txtMealName);
            imgFood = itemView.findViewById(R.id.imgFood);
        }
    }
}

两个问题完全不同。第一个是建议意味着如果你不想申请你可以跳过它。但我不建议这样做。

例如:

(没有 Lambda)

myButton.setOnClickListener(new View.OnClickListerner(){
    @Override
    void onClick(View v) {
        // do some stuff related to action    
    }
});

(使用 Lambda)

myButton.setOnClickListener(v -> {
   // do some stuff related to action
})

其他问题

没有附加布局管理器:

如果您的 RecyclerView 没有附加任何 LayoutManager,那么它将跳过,因为它不知道如何 arrange/show 项。

一些布局管理器:

  • 线性布局管理器
  • GridLayoutManager
  • StaggeredGridLayoutManager

如果您想创建自己的 LayoutManager,只需扩展 class LayoutManager

使用方法:

....
LinearLayoutManager layoutManager = new LinearLayoutManager();
layoutManager.setOrientation = LinearLayoutManager.HORIZONTAL
myRecyclerViewObj.setLayoutManager(layoutManager);
....

未连接适配器

类似于没有布局管理器,这将在没有适配器连接到回收器视图时显示,为此你必须使用 setAdapter 方法来设置你的适配器

例如:

....
MealsRecViewAdapter adapter = new MealsRecViewAdapter(this);
myRecyclerViewObj.setAdapter(adapter);
....