Модернизация Android: отображение в Recyclerview - PullRequest
0 голосов
/ 30 декабря 2018

У меня проблема с отображением моих данных json в виде переработчика.Вот мои данные JSON, в которых я хочу отобразить «ошибки» в представлении переработчика.Я пробовал несколько способов, но это всегда заставляет близко.

{
 "result": true,
 "errors": [
   {
    "id": "e1812696024",
    "offset": 2,
    "length": 2,
    "bad": "is",
    "better": [
      "am"
        ],
    "type": "grammar"
   },
   {
    "id": "e962925648",
    "offset": 8,
    "length": 8,
    "bad": "engeneer",
    "better": [
       "engineer",
       "engender"
        ],
    "type": "spelling"
    }
 ]
}

Вот мои коды: Service.class (Интерфейс)

public interface Service {

      @POST("/check.php")
      Call<InputResult> readErrors(@Query("userInput") String userInput,
                                   @Query("apiKey") String apiKey);
 }

Классы моделей: InputResult.java

public class InputResult {

    @SerializedName("result")
    private String result;

    @SerializedName("errors")
    private List<Errors> errors;

   //getter and setter
}

Errors.java

public class Errors {

   @SerializedName("id")
   private String id;

   @SerializedName("offset")
   private int offset;

   @SerializedName("length")
   private int length;

   @SerializedName("bad")
   private String bad;

   //getter and setter
}

Адаптер

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);
    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();
}

 //Viewholder
 ...
 }

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

ublic class Tab1Fragment_GrammarChecker extends Fragment {

private static final String TAG = "Tab1Fragment";
private PhotoAdapter adapter;

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

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

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

List<InputResult> inputResults = new ArrayList<>();
public ArrayList<InputResult> inputResultArrayList = new ArrayList<>();

public static String userInput = "I is an engeneer!";
public String apiKey = ""; 

@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;
}

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<InputResult> loadErrorsCall = serviceAPI.readErrors(userInput, apiKey);
    loadErrorsCall.enqueue(new Callback<InputResult>() {
        @Override
        public void onResponse(Call<InputResult> call, Response<InputResult> response) {
            if (response.isSuccessful()){
                inputResults = response.body();
                Log.i("ORIG. ARRAY SIZE", String.valueOf(inputResultArrayList.size()));
                if (inputResultArrayList != null){
                    for (int i = 0; i < 5; i++){
                        inputResultArrayList.add(inputResults.get(i));
                    }

                    Log.i("NEW ARRAY SIZE", String.valueOf(errorArrayList.size()));
                }
                mErrorsRecyclerView.setItemAnimator(new DefaultItemAnimator());
                mErrorsRecyclerView.setAdapter(new ResultAdapter1(getContext(), inputResultArrayList));
                Log.e("Fragment", response.body().toString());
                Log.e("Fragment", "SUCCESS");
            }
            else {
                Log.i("ERROR", "");
            }

        }

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

}

Logcat:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: renelyn.austria.grammatika, PID: 32547
java.lang.ClassCastException: renelyn.austria.grammatika.Model.InputResult cannot be cast to java.util.List
    at renelyn.austria.grammatika.Tab1Fragment_GrammarChecker$1.onResponse(Tab1Fragment_GrammarChecker.java:95)
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:71)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:145)
    at android.app.ActivityThread.main(ActivityThread.java:5832)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

Ответы [ 2 ]

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

модель, вероятно, должна выглядеть как вход JSON ...

с ArrayList<Error> errors вместо List:

public class Results {

    @SerializedName("result")
    private Boolean success;

    @SerializedName("errors")
    private ArrayList<Error> errors;
    ...
}

и другим (здесь *)1009 * можно использовать для сопоставления элементов String:

public class Error {

    @SerializedName("id")
    private String id;

    @SerializedName("offset")
    private Long offset;

    @SerializedName("length")
    private Long length;

    @SerializedName("bad")
    private String bad;

    @SerializedName("better")
    private List<String> better;

    @SerializedName("type")
    private String type;
    ...
}

, тогда оно должно работать, без каких-либо бессмысленных путаниц:

Results results = response.body();
if(results.getSuccess())
    ArrayList<Error> errors = results.getErrors();
}
0 голосов
/ 30 декабря 2018

Это не ваша проблема recyclerView, она связана с вашим вызовом дооснащения:

Вы определили inputResults как список:

List<InputResult> inputResults = new ArrayList<>();

Но вы заполнили его следующим образом:

inputResults = response.body();

Это не приемлемо.Ваш ответ, как я понял, является списком InputResult, но ваш вызов на модификацию - единственный InputResult:

Call<InputResult>

Вам не нужно сериализовать или десериализовать json самостоятельно.Просто прочитайте больше о модифицированных и модифицированных конвертерах.Все, что вам нужно сделать, это инициализировать модификацию с помощью GsonConverter и создать другую модель, содержащую список InputResult, и передать ее вызову модификации вместо InputResult, чтобы получить ответ сервера без каких-либо проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...