«Не удается преобразовать объект типа java.lang.String в тип», когда я нажимаю кнопку «Назад» на мобильном телефоне. - PullRequest
0 голосов
/ 17 октября 2018

У меня есть активность со SlidingTab, и когда я нажимаю кнопку «Назад» на мобильном телефоне, приложение просто вылетает и показывает эту ошибку:

  • Я использую Firebase, я не знаю, если этоимеет значение.

Это ошибка Logcat:

10-17 13:29:34.688 6074-6074/br.com.tecmafandroid.projeto.tecmaf               E/AndroidRuntime: FATAL EXCEPTION: main
    Process: br.com.tecmafandroid.projeto.tecmaf, PID: 6074
    com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type br.com.tecmafandroid.projeto.tecmaf.model.Contato
        at com.google.android.gms.internal.zzelw.zzb(Unknown Source)
        at com.google.android.gms.internal.zzelw.zza(Unknown Source)
        at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
        at br.com.tecmafandroid.projeto.tecmaf.fragment.ContatosFragment$1.onDataChange(ContatosFragment.java:101)
        at com.google.android.gms.internal.zzegf.zza(Unknown Source)
        at com.google.android.gms.internal.zzeia.zzbyc(Unknown Source)
        at com.google.android.gms.internal.zzeig.run(Unknown Source)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        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:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Это мой фрагмент Contatos (где появляется ошибка):

public class ContatosFragment extends Fragment {

private ListView listView;
private ArrayAdapter adapter;
private ArrayList<Contato> contatos;
private DatabaseReference firebase;
private ValueEventListener valueEventListenerContatos;
private String identificadorContato;

public ContatosFragment() {
    // Required empty public constructor
}

@Override
public void onStart() {
    super.onStart();
    firebase.addValueEventListener(valueEventListenerContatos);
    abrirCadastroContatoSuprimentos(); /* Criar a tela principal cadastra o contato Vendas - Validar e/ou logar cadastra o contato Assistencia - Entra no fragmento contatos cadastra o Suprimentos */

}

@Override
public void onStop() {
    super.onStop();
    firebase.removeEventListener(valueEventListenerContatos);
}

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                         Bundle savedInstanceState) {

    //Instânciar objetos
    contatos = new ArrayList<>();

    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_contatos, container, false);

    //Monta listview e adapter
    listView = (ListView) view.findViewById(R.id.lv_contatos);
    /*adapter = new ArrayAdapter(
            getActivity(),
            R.layout.lista_contato,
            contatos
    );*/
    adapter = new ContatoAdapter(getActivity(), contatos);
    listView.setAdapter(adapter);

    //Recuperar contatos do firebase
    //Preferencias preferencias = new Preferencias(getActivity());
    String identificadorUsuarioLogado = Base64Custom.codificarBase64(UsuarioFirebase.getIdentificadorUsuario());

    firebase = ConfiguracaoFirebase.getFirebase()
            .child("contatos")
            .child(identificadorUsuarioLogado);

    //Listener para recuperar contatos - mudar para uma lista fixa
    valueEventListenerContatos = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            //Limpar lista
            contatos.clear();

            //Listar contatos
            for (DataSnapshot dados : dataSnapshot.getChildren()) {

                Contato contato = dados.getValue(Contato.class);
                contatos.add(contato);

            }

            adapter.notifyDataSetChanged();

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };

    //Click na lista e abre a conversa - manter
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            Intent intent = new Intent(getActivity(), ConversaActivity.class);

            // recupera dados a serem passados
            Contato contato = contatos.get(position);

            // enviando dados para conversa activity
            String nome = contato.getNome();
            intent.putExtra("nome", contato.getNome()); // ta aqui o problema acho
            intent.putExtra("email", contato.getEmail());

            startActivity(intent);

        }
    });

    return view;

}

private void abrirCadastroContatoSuprimentos() {

    String emailContato;

    emailContato = "suprimentos@tecmaf.com.br";

    identificadorContato = Base64Custom.codificarBase64(emailContato);

    firebase = ConfiguracaoFirebase.getFirebase().child("usuarios").child(identificadorContato);

    firebase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            if (dataSnapshot.getValue() != null) {

                //Recuperar dados do contato a ser adicionado
                Usuario usuarioContato = dataSnapshot.getValue(Usuario.class);

                //Recuperar identificador usuario logado (base64)
                Preferencias preferencias = new Preferencias(getContext());
                String identificadorUsuarioLogado = Base64Custom.codificarBase64(UsuarioFirebase.getIdentificadorUsuario());

                firebase = ConfiguracaoFirebase.getFirebase();
                firebase = firebase.child("contatos")
                        .child(identificadorUsuarioLogado)
                        .child(identificadorContato);

                Contato contato = new Contato();
                contato.setIdentificadorUsuario(identificadorContato);
                contato.setEmail(usuarioContato.getEmail());
                contato.setNome(usuarioContato.getNome());

                firebase.setValue(contato);

                //Toast.makeText(getContext(), "Suprimentos OK", Toast.LENGTH_SHORT).show();

            } else {

                Toast.makeText(getContext(), "Problema ao adicionar contato suprimentos", Toast.LENGTH_LONG).show();

            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

   }

}

это мойcontato.class ():

public class Contato {

    private String identificadorUsuario;
    private String nome;
    private String email;

    public Contato() {
    }

    public String getIdentificadorUsuario() {
        return identificadorUsuario;
    }

    public void setIdentificadorUsuario(String identificadorUsuario) {
        this.identificadorUsuario = identificadorUsuario;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

Структура базы данных:

enter image description here

Эта проблема не отображается, когда я вернулся с:

getSupportActionBar (). SetDisplayHomeAsUpEnabled (true)

У кого-то есть идея?

1 Ответ

0 голосов
/ 17 октября 2018

Невозможно преобразовать объект типа java.lang.String в тип br.com.tecmafandroid.projeto.tecmaf.model.Contato

Возможно, это не тот тип, который вы устанавливаете на ArrayList:

Contato contato = dados.getValue(Contato.class);
contatos.add(contato);

Вы можете попытаться получить ссылку в своем запросе.сначала:

FirebaseDatabase.getInstance().getReference();

Затем найдите своего желаемого ребенка по UID, а затем получите необходимые предметы:

Contato contato = dados.child("contatos").child(identificadorUsuarioLogado).getValue(Contato.class);
String name = contato.getNome(); // for example

Затем установите для своих данных значение ArrayList из Strings а не модели :

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