Модернизация Android: строка URL-запроса "text = {userInput} & key = {apiKey}" не должна иметь блока замены.Для параметров динамического запроса используйте @Query - PullRequest
0 голосов
/ 28 декабря 2018

java.lang.IllegalArgumentException: строка запроса URL "text = {userInput} & key = {apiKey}" не должна иметь блок замены.Для параметров динамического запроса используйте @ Query.

Вот мой код:

public interface Service {

@GET("/check.php?text={userInput}&key={apiKey}")
Call<List<Errors>> readErrors(@Query("userInput") String userInput,
                              @Query("apiKey") String apiKey);
 }

И мой запрос на вызов:

public void loadJson(){

    Retrofit.Builder builder = new Retrofit.Builder()
            .baseUrl("https://api.textgears.com")
            .addConverterFactory(GsonConverterFactory.create());

    Retrofit retrofit = builder.build();

    Service serviceAPI = retrofit.create(Service.class);
    Call<List<Errors>> loadErrorsCall = serviceAPI.readErrors(userInput, apiKey);
    loadErrorsCall.enqueue(new Callback<List<Errors>>() {
        @Override
        public void onResponse(Call<List<Errors>> call, Response<List<Errors>> response) {
            errors = new ArrayList<>(response.body());
            Log.i("ORIG. ARRAY SIZE", String.valueOf(errors.size()));
            if (errors != null){
                for (int i = 0; i < 5; i++){
                    errorArrayList.add(errors.get(i));
                }

                Log.i("NEW ARRAY SIZE", String.valueOf(errorArrayList.size()));
            }

            mErrorsRecyclerView.setItemAnimator(new DefaultItemAnimator());
            mErrorsRecyclerView.setAdapter(new ResultAdapter(getContext(), errorArrayList));
        }

        @Override
        public void onFailure(Call<List<Errors>> call, Throwable t) {
            Log.i("Error: ", t.getMessage());
        }
    });
}

Каким должно быть решениек моей проблеме?

Редактировать: я уже исправил свою проблему, но другая проблема заключается в том, что мое окно рециркуляции не отображается.Сказать, что адаптер не найден, когда на самом деле у меня есть адаптер.Вот мои коды, класс адаптера и класс фрагмента.

Класс адаптера:

public class ResultAdapter extends RecyclerView.Adapter<ResultAdapter.ResultViewHolder>{

Context mContext;
List<Photo> photoList = new ArrayList<>();
List<Errors> errorsList = new ArrayList<>();

public ResultAdapter (Context mContext, List<Errors> errorsList){
    this.errorsList = errorsList;
    this.mContext = mContext;
}


@Override
public ResultViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.result_card, viewGroup, false);
    return new ResultViewHolder(view);
}

@Override
public void onBindViewHolder(ResultViewHolder resultViewHolder, int i) {

    Errors errors = errorsList.get(i);
    //Log.i("Position: ", i+1 + " Id: " + photos.getId());
    resultViewHolder.mNumErrorsTextView.setText(errorsList.size());
    resultViewHolder.mIdErrorTextView.setText(errors.getId());
    resultViewHolder.mLengthErrorTextView.setText(errors.getLength());
    resultViewHolder.mBadErrorTextView.setText(errors.getBad());
}

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

public class ResultViewHolder extends RecyclerView.ViewHolder{

    @BindView(R.id.NumofErrorsTextView)
    TextView mNumErrorsTextView;

    @BindView(R.id.ErrorIdTextView)
    TextView mIdErrorTextView;

    @BindView(R.id.ErrorLengthTextView)
    TextView mLengthErrorTextView;

    @BindView(R.id.ErrorBadTextView)
    TextView mBadErrorTextView;

    public ResultViewHolder(@NonNull View itemView) {
        super(itemView);

        ButterKnife.bind(this, itemView);
    }
}

Класс фрагмента:

public class Tab1Fragment_GrammarChecker extends Fragment {

private static final String TAG = "Tab1Fragment";

@BindView(R.id.InputTextEditText)
EditText mInputGrammarEditText;

@BindView(R.id.ErrorsRecyclerView)
RecyclerView mErrorsRecyclerView;

List<Errors> errors = new ArrayList<>();

public ArrayList<Errors> errorArrayList = new ArrayList<>();

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.tab1_grammar_checker, container, false);

    ButterKnife.bind(this, view);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
    mErrorsRecyclerView.setLayoutManager(layoutManager);
    loadJson();
    return view;
}

@OnClick(R.id.checkGrammarButton)
public void setOnClick(View view){
    Toast.makeText(getActivity(), "Check Grammar", Toast.LENGTH_LONG).show();
}

public void loadJson(){

    Retrofit.Builder builder = new Retrofit.Builder()
            .baseUrl("https://api.textgears.com")
            .addConverterFactory(GsonConverterFactory.create());

    Retrofit retrofit = builder.build();

    Service serviceAPI = retrofit.create(Service.class);
    Call<List<Errors>> loadErrorsCall = serviceAPI.readErrors(userInput, apiKey);
    loadErrorsCall.enqueue(new Callback<List<Errors>>() {
        @Override
        public void onResponse(Call<List<Errors>> call, Response<List<Errors>> response) {
            errors = new ArrayList<>(response.body());
            Log.i("ORIG. ARRAY SIZE", String.valueOf(errors.size()));
            if (errors != null){
                for (int i = 0; i < 5; i++){
                    errorArrayList.add(errors.get(i));
                }

                Log.i("NEW ARRAY SIZE", String.valueOf(errorArrayList.size()));
            }

            mErrorsRecyclerView.setItemAnimator(new DefaultItemAnimator());
            mErrorsRecyclerView.setAdapter(new ResultAdapter(getContext(), errorArrayList));
        }

        @Override
        public void onFailure(Call<List<Errors>> call, Throwable t) {
            Log.i("Error: ", t.getMessage());
        }
    });
}

}

1 Ответ

0 голосов
/ 28 декабря 2018

Ваш интерфейс API должен выглядеть следующим образом:

public interface Service {
@GET("/check.php")
Call<List<Errors>> readErrors(@Query("userInput") String userInput,
                              @Query("apiKey") String apiKey);
 }

Итак, замените ваш интерфейс на этот.

СОВЕТ: Пожалуйста, добавьте менеджер раскладки ввзгляд переработчика:

LinearLayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
mErrorsRecyclerView.setLayoutManager(mLayoutManager);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...