【发布时间】:2021-06-03 22:35:34
【问题描述】:
我正在我的 RecyclerViewAdapter 中编写此代码,并且我有一个单独的 Java 文件,我想从中为我的适配器类设置 ItemOnClickListener 和 Context。但是,它们显示为空。这是 Java 文件中用于 recyclerView 的方法。
public void update(){
userRef.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
String imageUrl;
String name;
String extra;
String ready;
String ingredients;
String id;
List<DocumentSnapshot> list = queryDocumentSnapshots.getDocuments();
for( int i = 0; i < list.size(); i++){
DocumentSnapshot documentSnapshot = list.get(i);
if(documentSnapshot.exists()){
Map<String, Object> favFood = documentSnapshot.getData();
name = favFood.get(KEY_NAME).toString();
imageUrl = favFood.get(KEY_URL).toString();
extra = favFood.get(KEY_XTRAINFO).toString();
ready = favFood.get(KEY_READY).toString();
Log.d("TAGG", ready);
ingredients = favFood.get(KEY_INGREDIENTS).toString();
id = favFood.get(KEY_ID).toString();
allFavoritedFoods.add(new FoodItem(imageUrl, name, ready, extra, ingredients, id, FirebaseAuth.getInstance().getCurrentUser().getUid()));
}
}
foodAdapter = new FoodAdapter(allFavoritedFoods, FavItem.this);
recyclerView.setAdapter(foodAdapter);
foodAdapter.setOnItemClickListener(FavItem.this);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
}
这是来自适配器类的相关代码:
public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.ViewHolder> {
private ArrayList<FoodItem> foodItems;
private Context context;
static String id;
private OnItemClickListener mListener;
public interface OnItemClickListener{
void onItemClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener){
mListener = listener;
}
@Override
public int getItemCount() {
return foodItems.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView name, readyTime, ingredients, extraInfo;
public ImageView picture;
Button favBtn;
FirebaseFirestore db = FirebaseFirestore.getInstance();
public static final String KEY_URL = "imageUrl", KEY_INGREDIENTS = "ingredients", KEY_READY = "ready";
public static final String KEY_NAME = "name";
public static final String KEY_XTRAINFO = "info";
public static final String KEY_ID = "id";
public static final String KEY_FAV = "favorited";
//public Button favBtn;
public ViewHolder(View itemView){
super(itemView);
name = itemView.findViewById(R.id.title);
picture = itemView.findViewById(R.id.thumbnail);
readyTime = itemView.findViewById(R.id.readyInMinutes);
ingredients = itemView.findViewById(R.id.ingredients);
extraInfo = itemView.findViewById(R.id.extraInfo);
itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(mListener!=null){
int position = getAdapterPosition();
if(position != RecyclerView.NO_POSITION){
mListener.onItemClick(position);
}
}
}
});
favBtn = itemView.findViewById(R.id.favBtn);
favBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
FoodItem foodItem = foodItems.get(position);
Map<String, Object> favFood = new HashMap<>();
favFood.put(KEY_NAME, foodItem.getTitle());
favFood.put(KEY_URL, foodItem.getImageUrl());
favFood.put(KEY_ID, foodItem.getId());
favFood.put(KEY_INGREDIENTS, foodItem.getIngredients());
favFood.put(KEY_READY, foodItem.getReadyTime());
favFood.put(KEY_XTRAINFO, foodItem.getExtraInfo());
db.collection(FirebaseAuth.getInstance().getCurrentUser().getEmail()).document(id+"").set(favFood)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(itemView.getContext(), "Added to Favorites", Toast.LENGTH_SHORT);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(itemView.getContext(), "Deleted From Favorites", Toast.LENGTH_SHORT);
Log.d("Error in Storing", e.toString());
}
});
}
});
}
}
public FoodAdapter(ArrayList<FoodItem> foodItems, Context context){
this.foodItems = foodItems;
this.context = context;
}
对于 MainActivity.java,这有效,但是 foodAdapter.setOnItemClickListener(MainActivity.this);。但它的工作方式与其他 Java 文件不同。 对于上下文,我会为其他 Java 文件中的方法放置什么以及为 onItemClickListener 放置什么?
【问题讨论】:
-
错误行在哪里?
-
这个:foodAdapter = new FoodAdapter(allFavoritedFoods, FavItem.this);问题出在 FavItem.this 上。
-
为什么其他setOnClickListener不使用mListener?
-
我不确定你指的是哪一个。
-
你不需要为mListener传入一个Activity吗?
标签: android google-cloud-firestore android-recyclerview