1

I searched here on stackoverflow but I still could not find the solution, so my question.

I created this method to deserialize the json that is coming (must be generic, since all calls pass here):

public class GsonUtil {

    public static Gson createGsonObject() {

        // Formado de data alterado, outro formato não estava convertendo
        // Alterado para setar // na saída devido problema com WebService
        GsonBuilder builder = new GsonBuilder();

        builder.setDateFormat(GsonUtil.FORMAT_DATE).create();

       ..............

        //ARRAY
        builder.registerTypeAdapter(List.class, new JsonArrayListDeserializer());

        //HOW TO DO
        //builder.registerTypeAdapter(List.class, new JsonArrayListSerializer());

        Gson gson = builder.create();

        return gson;
    }
        private static class JsonArrayListDeserializer<T> implements JsonDeserializer<ArrayList<T>>{

        @Override
        public ArrayList<T> deserialize(JsonElement jsonElement, java.lang.reflect.Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
            try {

                Gson gson = new Gson();
                TypeToken<ArrayList<T>> token = new TypeToken<ArrayList<T>>() {};
                ArrayList<T> value = gson.fromJson(jsonElement, token.getType());

                return value;
            } catch (ClassCastException e) {
                throw new JsonParseException("Cannot parse json Boolean '"
                        + jsonElement.toString() + "'", e);
            }
        }
    }
}

After creating this method, the data started arriving in the adapter, but the error appears when trying to insert them in the view.

Here is the error:

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to br.com.sisteplan.evida.atendimento.service_atendimento.vo.AgendamentoVo
                                                                                        at br.com.sisteplan.evida.atendimento.adapters.CustomRecyclerViewAdapterAt.getUsuarioVo(CustomRecyclerViewAdapterAt.java:90)

Fragment:

  public class FragmentAtendidos extends Fragment implements CustomRecyclerViewAdapterAt.onViewHolderClicksMedicamentosAdapter {

    private RecyclerView mRecyclerView;
    private RecyclerView.LayoutManager mLayoutManager;
    private CustomRecyclerViewAdapterAt mAdapter;
    private View view;
    private Spinner spinner;
    private ArrayList<AgendamentoVo> atendidosVos;
    private RetornoAtendidosVo retornoAtendidosVo;

    .....

        @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);


        mRecyclerView = (RecyclerView) getActivity().findViewById(R.id.fragment_recycler_view_at);
        // use this setting to improve performance if you know that changes
        // in content do not change the layout size of the RecyclerView
        mRecyclerView.setHasFixedSize(true);
        // use a linear layout manager
        mLayoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(mLayoutManager);

        // specify an adapter (see also next example)
        mAdapter = new CustomRecyclerViewAdapterAt(atendidosVos,
                (AppCompatActivity) getActivity(), this);

        mRecyclerView.setAdapter(mAdapter);
    }

    .....

        @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ..
        new AsyncTaskListarAtendidos(FragmentAtendidos.this.getFragmentManager(), false).execute(profissionalVo);
    }

    ...

     private class AsyncTaskListarAtendidos extends BaseAsyncTask<ProfissionalVo,Void,AsyncTaskResult<RetornoAtendidosVo>> {

        private FragmentManager mFragmentManager;
        private ProfissionalVo profissionalVo;

        public AsyncTaskListarAtendidos(FragmentManager fragmentManager, boolean isDialogShow) {
            super(fragmentManager, isDialogShow);
            this.mFragmentManager = fragmentManager;
        }

        @Override
        protected AsyncTaskResult doInBackground(ProfissionalVo... profissionalVos) {

            try {
                profissionalVo = profissionalVos[0];

                RetornoAtendidosVo retorno = ServiceAgendamentosAtendidos.getInstance(MyApplicationInstance.getInstanceApplicationSingleton().getDsChaveAcessoWbs())
                        .consultaAtendidos(profissionalVo);

                return new AsyncTaskResult<RetornoAtendidosVo>(retorno);
            }catch (Exception e){
                return new AsyncTaskResult<Retorno>(e);
            }
        }

        @Override
        protected void onPostExecute(AsyncTaskResult<Retorno> respProfissionalVO) {
            super.onPostExecute(respProfissionalVO);

            if (respProfissionalVO.getExceptionResult() == null && getActivity() != null){
                retornoAtendidosVo = (RetornoAtendidosVo) respProfissionalVO.getResult();
                retornoAtendidosVo.getRetorno();
                atendidosVos = (ArrayList<AgendamentoVo>)retornoAtendidosVo.getRetorno();

                mAdapter = new CustomRecyclerViewAdapterAt(atendidosVos,(AppCompatActivity)getActivity(),this);

                mRecyclerView.setAdapter(mAdapter);
            }
        }
    }

}

My Adapter:

public class CustomRecyclerViewAdapterAt extends
        RecyclerView.Adapter<CustomRecyclerViewAdapterAt.ViewHolder>
        implements OnClickListener {

    private AppCompatActivity appCompatActivity;
    private Object mClassListner;
    private ArrayList<AgendamentoVo> mDataset;
    // Animation
    private int lastPosition = -1;

    // Provide a suitable constructor (depends on the kind of dataset)
    public CustomRecyclerViewAdapterAt(ArrayList<AgendamentoVo> myDataset, AppCompatActivity appCompatActivity, Object classListner) {

        this.appCompatActivity = appCompatActivity;
        mDataset = myDataset;
        this.mClassListner = classListner;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public ViewHolder onCreateViewHolder(
            ViewGroup parent, int viewType) {
        // create a new view
        View v = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.cell_item_atendidos, parent, false);
        // set the view's size, margins, paddings and layout parameters

        ViewHolder vh = new ViewHolder(v);

        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        AgendamentoVo pacienteVo = getUsuarioVo(position);

        // Configura a view com o Id do Agendamento
        holder.mLinearLayout.setTag(position);
        holder.mTextViewNome.setText(pacienteVo.getPaciente().getNmUsuario() != null ? pacienteVo.getPaciente().getNmUsuario() : "Branco");
        /*holder.mTextViewIdade.setText(mDataset.get(position).getPaciente().getIdade() != null ? mDataset.get(position).getPaciente().getIdade() : "Branco2");*/
//        holder.mTextViewIdadeDescricao.setText(pacienteVo.getIdade() != null ? pacienteVo.getIdade() : "");

        /**
         *Configuração de ouvintes de click *
         */
        holder.mLinearLayout.setOnClickListener(this);

        // Here you apply the animation when the view is bound
        setAnimation(holder.mCardView, position);
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {

        if (mDataset != null) {
            SavedPreferences.setQtdHistorico(appCompatActivity, mDataset.size());
            return mDataset.size();
        }
        return 0;
    }

    public AgendamentoVo getUsuarioVo(int position) {

        return mDataset.get(position);
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.cell_item_at_linearlayout_content:

                ((onViewHolderClicksMedicamentosAdapter) mClassListner)
                        .onCellClickContent(v);
                break;
            default:
                break;
        }

    }

    /**
     * Here is the key method to apply the animation
     */
    private void setAnimation(View viewToAnimate, int position) {
        // If the bound view wasn't previously displayed on screen, it's
        // animated
        if (position > lastPosition) {

            Animation animation = AnimationUtils.loadAnimation(
                    appCompatActivity, android.R.anim.slide_in_left);
            // Animation animation = AnimationUtils.loadAnimation(
            // appCompatActivity, R.anim.slide_top_to_bottom);
            // Animation animation =
            // AnimationUtils.loadAnimation(appCompatActivity,
            // R.anim.clockwise_rotation);
            // animation.setRepeatCount(Animation.START_ON_FIRST_FRAME);
            viewToAnimate.startAnimation(animation);

            lastPosition = position;
        }
    }

    /**
     * Interface para notificação do click nos layouts
     *
     * @author Erick Brittes
     */
    public static interface onViewHolderClicksMedicamentosAdapter {

        /**
         * @param caller
         */
        public void onCellClickContent(View caller);
    }

    // Provide a reference to the views for each data item
    // Complex data items may need more than one view per item, and
    // you provide access to all the views for a data item in a view holder
    public static class ViewHolder extends RecyclerView.ViewHolder {

        public CardView mCardView;

        public LinearLayout mLinearLayout;
        public AppCompatTextView mTextViewNome;
        public AppCompatTextView mTextViewIdade;
        public AppCompatTextView mTextViewIdadeDescricao;

        public ViewHolder(View v) {
            super(v);

            mCardView = (CardView) v
                    .findViewById(R.id.cell_item_at_cardview);

            mLinearLayout = (LinearLayout) v
                    .findViewById(R.id.cell_item_at_linearlayout_content);

            mTextViewNome = (AppCompatTextView) v
                    .findViewById(R.id.cell_item_at_textview_nome_paciente);

            mTextViewIdade = (AppCompatTextView) v
                    .findViewById(R.id.cell_item_at_textview_idade);

            mTextViewIdadeDescricao = (AppCompatTextView) v
                    .findViewById(R.id.cell_item_at_textview_content_idade_descricao);

        }
    }
}

LogCat takes me to this error line:

holder.mTextViewNome.setText(pacienteVo.getPaciente().getNmUsuario() != null ? pacienteVo.getPaciente().getNmUsuario() : "Branco");

What do I have to do to resolve this error? Thank you!

EDIT:

Result in my adapter:

enter image description here

  • i prefer to stop using AsyncTask and start working on retrofit2 or volley, its faster and has more options also you don't need to write your jsonUtil class, these libs handle every thing. – AbuQauod Apr 17 '18 at 13:06
  • Me too! But I do not have this option in this project. –  Apr 17 '18 at 13:20

1 Answers1

0

It is case of Serializing and Deserializing Generic Types. This may be help you https://stackoverflow.com/a/32494079/2264534

immodi
  • 607
  • 1
  • 6
  • 21
  • Appreciate! I had read this question, but I did not understand how to implement it in my case. –  Apr 17 '18 at 12:49