新 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);
....
我从 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);
....