[英]How do I add API data to a fragment's recycler view using query text listener to call the GET query
我创建了一个 requestManager class
package com.example.pantry;
import android.content.Context;
import com.example.pantry.models.apiResponse;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.GET;
import retrofit2.http.Query;
public class requestManager {
Context context;
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.spoonacular.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
public requestManager(Context context){this.context = context;}
public void getFoodNames(OnFetchDataListener listener, String query){
callFoodApi CallFoods = retrofit.create(callFoodApi.class);
Call<apiResponse> call = CallFoods.callFoods(context.getString(R.string.api_key), query, "5");
call.enqueue(new Callback<apiResponse>() {
@Override
public void onResponse(Call<apiResponse> call, Response<apiResponse> response) {
if(!response.isSuccessful()){
listener.didNotFetch(response.message());
}
listener.didFetch(response.body(), response.message());
}
@Override
public void onFailure(Call<apiResponse> call, Throwable t) {
listener.didNotFetch(t.getMessage());
}
});
}
private interface callFoodApi{
@GET("food/ingredients/search")
Call<apiResponse> callFoods(
@Query("apiKey") String apiKey,
@Query("query") String query,
@Query("number") String number
);
}
}
和一个 FetchDataListener 接口
package com.example.pantry;
public interface OnFetchDataListener<apiResponse> {
void didFetch(apiResponse response, String message);
void didNotFetch(String message);
}
这是我的片段代码
RecyclerView recyclerView;
addFoodAdapter adapter;
requestManager manager;
SearchView searchView;
String foodNames;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_add_food, container, false);
searchView = view.findViewById(R.id.addFoodSearch);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
foodNames = query;
manager.getFoodNames(listener, foodNames);
Log.d("executed", "submitted");
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
return view;
}
private final OnFetchDataListener<apiResponse> listener = new OnFetchDataListener<apiResponse>() {
@Override
public void didFetch(apiResponse apiResponse, String message) {
recyclerView = recyclerView.findViewById(R.id.addFoodRecycler);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
adapter = new addFoodAdapter(apiResponse.results);
recyclerView.setAdapter(adapter);
}
@Override
public void didNotFetch(String message) {
Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show();
}
};
适配器
package com.example.pantry;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.pantry.models.Result;
import java.util.List;
public class addFoodAdapter extends RecyclerView.Adapter<addFoodViewHolder> {
private List<Result> foodNames;
public addFoodAdapter(List<Result> foodNames){
this.foodNames = foodNames;
}
@NonNull
@Override
public addFoodViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new addFoodViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.add_food_row, parent, false));
}
@Override
public void onBindViewHolder(@NonNull addFoodViewHolder holder, int position) {
holder.foodName.setText(foodNames.get(position).getName());
}
@Override
public int getItemCount() {
return foodNames.size();
}
}
和观众
package com.example.pantry;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class addFoodViewHolder extends RecyclerView.ViewHolder {
TextView foodName;
public addFoodViewHolder(@NonNull View itemView) {
super(itemView);
foodName = itemView.findViewById(R.id.addFoodItem);
}
}
但是当我尝试运行它并提交搜索查询时,应用程序崩溃了,我在日志中收到错误响应
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.pantry.requestManager.getFoodNames(com.example.pantry.OnFetchDataListener, java.lang.String)' on a null object reference
我试图解决它并弄清楚只有在提交搜索时才会出现崩溃和错误。 我只做了几个月,所以还在学习,但我很迷茫,这是碎片问题还是我只是误解了碎片的工作原理? 任何帮助将不胜感激。
我没有初始化经理
解决了
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
v = inflater.inflate(R.layout.fragment_add_food, container, false);
searchView = v.findViewById(R.id.addFoodSearch);
*manager = new requestManager(getContext());*
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
foodNames = query;
manager.getFoodNames(listener, foodNames);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
return v;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.