繁体   English   中英

如何使用查询文本侦听器将 API 数据添加到片段的回收器视图以调用 GET 查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM